1. 程式人生 > >複雜連結串列的複製(C語言)

複雜連結串列的複製(C語言)

##什麼是複雜連結串列?

展示一下複雜連結串列的結構體樣式。

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