考研相關的單鏈表題目

結構:
typedef int ElemType;
typedef struct LNode {
	ElemType val;
	struct LNode *next;
}*LinkedList;

//將一個沒有頭結點的結點數據爲字符的單鏈表,分解成還有字母字符、數字字符和其餘字符的三個帶頭節點的循環鏈表
void OneToThree(LinkedList l,LinkedList la,LinkedList ld,LinkedList lo)
{
	while(l != nullptr)
	{
		LinkedList r = l;
		l = l->next;
		if(r->val >= 'a' && r->val <= 'z' || r->val >= 'A' && r->val <= 'Z')
		{
			r->next = la->next;
			la->next = r;
		}
		else if(r->val >= 0 && r->val <= 9)
		{
			r->next = ld->next;
			ld->next = r;
		}else
		{
			r->next = lo->next;
			lo->next = r;
		}
	}
} 


//不帶頭結點的刪除有序鏈表中元素相同的結點
//如 1 2 2 3 返回 1 2 3
LinkedList  DelSame_None(LinkedList head)
{
    LinkedList  pre = head;
    LinkedList  p = pre->next;
    while(p != nullptr)
    {
        if(p->val == pre->val)
        {
            LinkedList  tmp = p;
            p = p->next;
            free(tmp);
        }
        else {
            pre->next = p;
            pre = p;
            p = p->next;
        }
    }
    pre->next = p;
}



//帶頭結點的刪除有序鏈表中元素相同的結點
LinkedList  DelSame(LinkedList la)
{
    LinkedList  pre = la->next;
    LinkedList  p = pre->next;
    while(p != nullptr)
    {
        if(p->val == pre->val)
        {
            LinkedList  tmp = p;
            p = p->next;
            free(tmp);
        }
        else {
            pre->next = p;
            pre = p;
            p = p->next;
        }
    }
    pre->next = p;
}


/*
設有一個由正整數組成的無序單鏈表,帶頭結點。
(1)找出最小值,而且打印該值
(2)若是該數爲奇數,則將其與直接後繼結點的數值交換
(3)若是該數爲偶數,則將其直接後繼結點刪除
*/

void MinValue(LinkedList head)
{
	LinkedList p = head->next; 
        //不帶頭結點爲 LinkedList p = head;
	LinkedList pre = p;
	while(p != nullptr)
	{
		if(p->val < pre->val)
			pre = p;
		p = p->next;
	}
	cout<<pre->val<<endl;
	if(pre->val % 2 != 0)
	{
		if(pre->next != nullptr)
		{
			int tmp = pre->val;
			pre->val = pre->next->val;
			pre->next->val = tmp;
		}
	}
	else{
		if(pre->next != nullptr)
		{
			LinkedList u = pre->next;
			pre->next = u->next;
			free(u);
		}
	}
}


//帶頭節點的單鏈表的逆置
LinkedList invertlist(LinkedList head)
{
	LinkedList p = head->next;
	head->next = nullptr;
	while(p != nullptr)
	{
		LinkedList  r = p->next;
		p->next = head->next;
		head->next = p;
		p = r;	
	}	
	return head;
} 


//不帶頭節點的單鏈表的逆置
LinkedList invertlist_None(LinkedList &head)
{
	if(head == nullptr)
		return nullptr;
	if(head->next == nullptr)
		return head;
	LinkedList p1,p2,p3;
	p1 = head;
	p2 = head->next;
	head->next = nullptr;
	p3 = p2->next;
	while(p3 != nullptr)
	{
		p2->next = p1;
		p1 = p2;
		p2 = p3;
		p3 = p2->next;
	}	
	p2->next = p1;
	head = p2;
	return head;
} 


//帶頭結點的循環鏈表,將表中的第i個結點(i大於1)到m結點(m>3)這部分倒置(1<i<m) 
LinkedList PatternInvert(LinkedList L,int i,int m )
{
	if(i < 1 || i >=m || m < 4)
	{
		cout<<"²ÎÊý´íÎó"<<endl;
		exit(0);
	}
	LinkedList p = L->next->next;
	LinkedList pre = L->next;
	int j = 1;
	while(j < i - 1)
	{
		j++;
		pre = p;
		p = p->next;
	}
	LinkedList q = p;//ÔÝ´æµÚi¸ö½áµã
	p = p->next; //pÖ¸ÏòµÚn+1¸ö½áµã
	j += 2;
	while(j <= m)
	{
		LinkedList r = p->next;
		p->next = pre->next;
		pre->next = p;
		p = r;
		j++;
	} 
	q->next = pre->next;	 	 
}

/*
判斷第二項起的每一個元素值是否等於其序號的平方減去其前驅的值
知足返回true 不知足返回false
*/
//不帶頭結點 
boolJudge_None(LinkedList la)
{
	LinkedList p = la->next;
	LinkedList pre = la;
        //帶頭結點寫成
        //LinkedList p = la->next->next;
	//LinkedList pre = la->next;    
	int i = 2;
	while(p != nullptr)
	{
		if(p->val == i*i - pre->val)
		{
			i++;
			pre = p;
			p = p->next;
		}
		else 
			break;
	}
	if(p != nullptr)
	{
		return false;
	}
	else 
		return true;
}
相關文章
相關標籤/搜索