在鍊錶的中有這樣一類鍊錶。它至少包含兩個指標。其中乙個指向下乙個結點。有乙個指標隨機的指向鍊錶的其它結點,也可能指向它自己,也可能指向null。對於該類鍊錶的複製來說。最大的難度就是如何處理複製的新鍊錶的這個隨機指標指向的問題。因此在對該類煉表處理時,就必須根據源鍊錶的指標指向來得到新鍊錶的隨機指標得指向。意思就是讓新鍊錶得結點和源鍊錶得對應結點必須有乙個關係。
解決該問題的一般方法就是:①先複製該鍊錶,並且讓新鍊錶的每個新節點跟在源鍊錶的源結點後面(其實還是一條鍊錶)。可以將新結點的隨機指標先置空。②這樣做有乙個特點就是新結點的隨機指標指向的就是對應源結點得隨機指標指向的結點得下乙個結點(因為新結點總是緊跟在源結點的後面),這樣就可以得到新結點的隨機指標指向的位置(對應結點)。③接下來就是將該合併在一起的源新鍊錶拆分開就ok了。標記新鍊錶的頭結點,改變所有結點的下乙個結點的指向。**如下:
#pragma once
#include#include#define datatype int
//定義鍊錶型別
typedef struct linknode
linknode;
//建立新結點
linknode* createnode(datatype data);
//複製複雜鍊錶
linknode* copylinklist(linknode* head);
函式體實現:
#include"linklist.h"
//建立新節點
linknode* createnode(datatype data)
//初步複製鍊錶結點且合併為一條鍊錶
void copynewnode(linknode* head)
}//將新鍊錶的隨機指標進行相應指向
void copyrandom(linknode* head)
ptr = ptr->next->next; }}
//拆分得到新鍊錶
linknode* split(linknode* head)
if (ptrhead != null)
else
}return newhead;
}//複雜鍊錶的複製
linknode* copylinklist(linknode* head)
//第一步先複製鍊錶並跟在源鍊錶結點後面
copynewnode(head);
//第二布覆制源鍊錶的random
copyrandom(head);
//第三步拆分源新鍊錶
linknode* newlinklist = split(head);
return newlinklist;
}
主函式測試:
#include"linklist.h"
#includeint main()
printf("\n");
newlist = ptr;
while (newlist != null)
else
newlist = newlist->next;
} printf("\n");
system("pause");
return 0;
}
結果顯示:
注意:1.在對隨機指標指向時注意為空的情況。2.在對指標進行解引用時注意會不會為空。珍&原始碼
初夏小談 交換鍊錶結點(鍊錶高階操作)
交換兩個鍊錶中的結點,就是要將要交換的兩個結點改變,而其它結點不變。交換兩個結點,就要找到它的前乙個結點,將前乙個結點的next改為另乙個要交換的結點的位址即可,但是這樣交換,那麼交換得結點及它後的所有結點會全部接到另乙個結點,所以再標記兩個結點 即兩個結點後面的結點 這樣就可以方便的進行交換的後續...
鍊錶 複雜鍊錶的複製
問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...