面試題 複雜鍊錶的複製

2021-08-03 21:20:18 字數 1986 閱讀 9793

對於這個題,基本會有三個思路:

1.這裡鍊錶的複製和單鏈表最大的不同,就是多了乙個自由指標(psub),那麼最簡單的想法就是,遍歷單鏈表,找到psub指向的節點,然後複製,這樣做最簡單,事件複雜度為o(n的平方);

2. 基於第一種方法的優化,第一種方法把事件浪費在了查詢節點上,那麼我們可以建立乙個雜湊函式,對節點建立唯一的鍵值對(k,v), 在複製時,利用雜湊函式,時間為o(n);

3.當然雜湊函式雖好,但是明顯是以空間來換時間,那麼有沒有其他方法呢?能不能不開闢輔助空間呢?

(1)(2)將新節點的psub連線起來。

1.設定兩個指標,一前一後分別指向新舊節點;

2.新節點的psub = 老節點的psub->next;

思路為:

1.設定三個指標

2.乙個作為新鍊錶的頭結點;

3.剩餘兩個交替指向新舊節點,具體如圖

* 第一步:將每乙個節點建立出來,並插在對應節點的後面

* 第二步:將每個新建的節點的psub連線好

* 第三步:將兩個鍊錶分開

*/void copynewnode(pnode phead)

pnode temp = phead;

while ( null != temp) }

void connectpsub(pnode phead)

pnode pn1 = phead;

pnode pn2 = phead->next;

while (null != pn2->next && null != pn2->next->next)

pn1 = pn1->next->next;

pn2 = pn2->next->next;

} if (null != pn2->next)

else

}}pnode separatelist(pnode phead)

pnode pold = phead;

pnode pphead = null;

pnode ppnode = null;

pphead = ppnode = phead->next;

while (null != ppnode->next)

return pphead;

}#include "1.hpp"

int main()

面試題 複雜鍊錶複製

lettcode面試題35.複雜鍊錶的複製 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。class node int val node next node...

面試題26 複雜鍊錶的複製

以下圖為5個結點的複雜鍊錶,實線表示m pnext指標的指向,虛線表示m psibling指標的指向 方法一 分兩步 1 遍歷一遍鍊錶,用m pnext指標將鍊錶連起來,o n 2 確定每個m psibling指標的指向,需重新遍歷新鍊錶確定其m psibling的指向,o n 時間代價為o n 2...

面試題30 複雜鍊錶的複製

題目 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複製鍊錶中,每乙個結點除了有乙個m pnext指標指向下乙個結點處,還有乙個m psibling指向鍊錶中的任意結點或者null。結點定義如下 struct complexli...