複雜連結串列的複製(C語言)
阿新 • • 發佈:2018-11-11
##什麼是複雜連結串列?
展示一下複雜連結串列的結構體樣式。
typedef struct ComplexNode
{
struct ComplexNode *next;
struct ComplexNode *random; //指向一個隨機值
int data;
}ComplexNode;
複雜連結串列就是一個帶著random指標的單鏈表。由於random指向的不確定性。讓複雜連結串列的操作存在一定的困難。
假定現在有一個複雜連結串列的形狀如下圖:
首先我得思路是建立一個新的連結串列,依次複製每個節點,但是問題出現了,random指向一個隨機值,這個隨機值可能沒有建立呢,所以依次複製會出現錯誤。 random的複製成了難題。
所以常規方法行不通,有時候一條路走到黑就真的黑了。
##解題思路
1.首先我們在每個連結串列節點的後面建立一個新的節點,將其串聯起來。如下圖的黃色箭頭所示。
如圖所示:
2.接下來,我們將它的新節點的random指向該指的地方,如下圖的綠色箭頭所示。
如圖所示:
3.接下來我們把兩個混在一起的連結串列拆開,拆開就可以變成兩個連結串列。
如圖所示:
##用C語言實現上述操作過程
ComplexNode* Copy(ComplexNode **List)
{
//在每個連結串列節點後面加一個節點。
ComplexNode *cur = *List;
ComplexNode * NewNode = NULL;
ComplexNode *Next = NULL;
ComplexNode *NewNodeNext = NULL;
ComplexNode *NewList = NULL;
while (cur != NULL) //通過迴圈在原始連結串列的基礎上建立新的連結串列,並且掛載在後面。
{
NewNode = CreateNode(cur->data); //createnode函式是建立一個新的節點
NewNode->next = cur->next;
cur->next = NewNode;
cur = NewNode- >next;
}
//改變連結串列的隨機指標域的結構
cur = *List;
while (cur != NULL)
{
if (cur->random != NULL) //這個只要random的值不是null就需要找到 對應的newnode的random的位置。
{
NewNode = cur->next;
NewNode->random = cur->random->next;
}
cur = cur->next->next; //依次條兩個節點相當於在原連結串列上移動一個
}
//將新舊兩個連結串列拆開
cur = *List;
NewList = cur->next;
//cur修正的是原連結串列,NewList修正的是新連結串列
while (cur != NULL)
{
NewNode = cur->next;
Next = cur->next->next;
if (Next == NULL) //當Next為空時,說明連結串列的修正快要結束了。
{
NewNodeNext = NULL;
}
else
{
NewNodeNext = Next->next;
}
cur->next = Next;
NewNode->next = NewNodeNext;
cur = Next;
}
return NewList;
}