複雜鍊錶的複製

2022-07-23 22:45:30 字數 1303 閱讀 9814

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

結點結構體如下:

/*

struct randomlistnode

};*/

這是一道劍指offer上的題目。下面看一下解析吧。

在做這道題之前,自己的想法是先把鍊錶中的next域全部複製,這時候原複雜鍊錶的random域的所有指向都會存在於剛才複製的鍊錶中,之後再遍歷原複雜鍊錶,將新鍊錶random域與原鍊錶random域相互對應即可。

但是過程中問題就出現了,雖然我可以在將原鍊錶的所有next域全部複製,也保證了即將要複製的random域的指向存在於該鍊錶中,但是random域是隨機指的,也就是說並不知道當前的random域指向的結點在前面還是後面,如此一來,如果還要繼續下去,恐怕還要巢狀一層迴圈。

為此,又在網上找了大神的部落格參考下,真的是受益匪淺。

想想我們平時複製貼上一段文字的時候是怎麼做的?是照著那段文字乙個乙個的再敲一次嗎?並不是,很顯然,我們是直接在該段文字上覆制,然後將複製後的文字貼上到我們想要的地方。

上面的笨辦法顯然就是乙個乙個的再敲乙個鍊錶出來,並沒有做真正的複製

那怎麼做?對,就是直接在原煉表上覆制乙份鍊錶,最後將我們想要的備份鍊錶從原煉表中抽離出來。

具體分三個步驟:

1.再原鍊錶的每個結點後面插入乙個與當前結點資料域相同的結點

2.複製random域的對應關係

3.抽離鍊錶

完整**如下

randomlistnode* clone(randomlistnode*phead)

randomlistnode *head =null;

randomlistnode *p, *pf =null;

randomlistnode *q;

//先複製結點

for(p = phead; p; p = p->next->next)

//複製random域對應關係

for(p = phead; p; p = p->next->next)

else

}//抽離鍊錶

head = phead->next;

for(p = phead, q = head; q; q = q->next)

}return

head;

}

end。

鍊錶 複雜鍊錶的複製

問題描述 請實現函式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指標的節點,之後...