1、題目描述
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
2、**和思路
2.1思路:
將原始鍊錶的每個節點的後面新建乙個和該結點值一樣的結點並插入到該結點的後面;再複製每個節點的隨機指向指標的指向;最後從混合鍊錶中分離出複製後的鍊錶。演算法步驟如下;
(1)遍歷原始鍊錶的每個節點,對於每個節點新建立乙個節點,其值為當前結點的值,並將新建立結點插到當前節點的後面。
(2)遍歷插入建立節點後的原始鍊錶,為每個建立的結點賦值其隨機指向指標的值。
(3)從最後形成的混合鍊錶中的分離出最後需要的複製後的鍊錶。(注意:最後這一步分離後需要保證原始鍊錶和沒複製前一樣)
2.2**:
class solution
//複製隨機指向
p=phead;
while(p)
//從混合鍊錶中拆出複製後的鍊錶
//需要注意的是:拆分後原鍊錶不能變
//1找到複製鍊錶的頭指標
randomlistnode* pnodeclone, *pheadclone, *pnode;
pnodeclone = pheadclone = phead->next;
pnode = pnodeclone->next;
phead->next = pnode;
//2拆分,先為next指標賦值,再為節點指標賦值
while(pnode)
return pheadclone;
}};
難點分析:
(1)首先需要想到這個思路,鍊錶複製中最難的是每個節點隨機指向指標的位址的複製,這是難點。所以要先插入複製整個鍊錶,這樣方便複製節點的隨機指向指標的位址。
(2)鍊錶操作:涉及到鍊錶的操作,設計的next等操作容易出錯。這裡總結乙個小經驗:涉及鍊錶的操作,總是先為next指標賦值,再將next的值賦值給新的結點指標,因為先為next指標賦值,可以先保證鍊錶的連貫性,指向的連貫。
(3)鍊錶拆分是難點,需要保證拆分後的原始鍊錶不變。
鍊錶 複雜鍊錶的複製
問題描述 請實現函式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...
複製複雜鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...