鏈表面試題 進階 二

一:1尋找兩條鏈表裏面的相同元素

       2尋找兩條連表裏面不同的元素  (都不考慮帶環問題)

二:複雜鏈表的複製。一個鏈表的每個節點,有一個指向next指針指向下一個節點,還有一個random指針指向這個鏈表中的一個隨機節點或者NULL,現在要求實現複製這個鏈表,返回複製後的新鏈表。 


//ps: 複雜鏈表的結構
struct ComplexNode
{
int _data ; // 數據
struct ComplexNode * _next; // 指向下一個節點的指針
struct ComplexNode * _random; // 指向隨機節點(可以是鏈表中的任意節點 or 空)
}; 


1 尋找兩條鏈表裏面的相同元素

   不考慮n次循環求相同元素,要求只能每條鏈表便利一次。



鏈表的冒泡排序在另一篇博客 http://blog.csdn.net/zhang1308299607/article/details/73071824

排序完成後

void Find_The_Same(ListNode* pList1,ListNode* pList2)
{
	//1含有空鏈表
	//2不含空鏈表
  ListNode* curList1 = pList1;
  ListNode* curList2 = pList2;
  if(pList1 == NULL || pList2 == NULL)
  {
        return ;
  }
  while(curList1 && curList2)
  {
	if(curList1->data == curList2->data)
	{
		printf("%d ",curList1->data);
		curList1 = curList1->next;
		curList2 = curList2->next;
	}
	else if(curList1->data > curList2->data)
	{
		curList2 = curList2->next;
	}
	else
	{
		curList1 = curList1->next;
	}
  }
}

  2尋找兩條連表裏面不同的元素 


void Find_The_Diffrent(ListNode* pList1,ListNode* pList2)
{
	//1含有空鏈表
	//2不含空鏈表
  ListNode* curList1 = pList1;
  ListNode* curList2 = pList2;
  ListNode* tmp = NULL;
  if(pList1 == NULL || pList2 == NULL)
  {
        return ;
  }
  while(curList1 && curList2)
  {
	  if(curList1->data == curList2->data)
	  {
		  curList1 = curList1->next;
		  curList2 = curList2->next;
	  }
	  else if(curList1->data < curList2->data)
	  {
			printf("%d ",curList1->data);
	        curList1 = curList1->next;
	  }
	  else
	  {
		  printf("%d ",curList2->data);
		  curList2 = curList2->next;
	  }
  }
  if(curList1 != NULL)
	  tmp = curList1;
  if(curList2 != NULL)
      tmp = curList2;
  while(tmp)
  {
    printf("%d ",tmp->data);
    tmp = tmp->next;
  }
}


二 複雜鏈表複製

1原始鏈表:


2添加元素後的鏈表:


3給添加上去的節點random指針賦值:

每個新節點的random值就是自身前一個節點的random->next(前一個節點random不爲空,如果爲空那就是NULL) ,比如新節點1的random應該是NULL指向新節點3. 而 舊節點1的  random->next (恰指向是新節點3)      

4把新節點摘下來

注意恢復原始鏈表。                                                                                             

ComplexNode* CopyComplexList(ComplexNode* pList)
{
	//一:鏈表尾爲空
	//1 返回
	//二:只有一個節點
	//1 複製
	//三 :有多個節點
	//1在每個節點後面插入一個相同的節點
	//2找出每個新節點的random值
	//3把每個節點摘下來然後鏈接起來
	ComplexNode* curpList = pList;
	if(pList == NULL)
	{
		return NULL;
	}
	else if(pList->next == NULL)
	{
		ComplexNode* Newhead = BuyComplexNode(pList->data);;
		Newhead->next = pList->next;
		Newhead->random = pList->random;
	    return Newhead;
	}
	else
	{
		ComplexNode* tmp;
		ComplexNode* head;
		ComplexNode* Next;
		ComplexNode* Newhead;
		while(curpList != NULL)
		{
			//添加節點
			tmp = BuyComplexNode(curpList->data);
			tmp->next = curpList->next;
			curpList->next = tmp;

			curpList = curpList->next->next;
		}
		//添加random指針
		head = pList;
		Next = pList->next;
		while( Next->next)
		{
			if(head->random != NULL)
				Next->random = head->random->next;
			else
				Next->random = NULL;
			head = head->next->next;
			Next = Next->next->next;
		}
		if(head->random != NULL)
				Next->random = head->random->next;
		else
				Next->random = NULL;
		//摘節點 恢復原鏈表
		head = pList;
		Next = pList->next;
		Newhead = Next;
		while(Next->next->next->next)
		{

			head->next = head->next->next;
			Next->next = Next->next->next;

			head = head->next;
			Next = Next->next;

		}
		head->next = Next->next->next;
		Next->next = Next->next->next;
		return Newhead;
	}

}





發佈了55 篇原創文章 · 獲贊 47 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章