一: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;
}
}