面試題26 複雜鍊錶的複製

2021-06-25 15:51:34 字數 1961 閱讀 5638

以下圖為5個結點的複雜鍊錶,實線表示m_pnext指標的指向,虛線表示m_psibling指標的指向

方法一:

分兩步

1:遍歷一遍鍊錶,用m_pnext指標將鍊錶連起來,o(n)

2:確定每個m_psibling指標的指向,需重新遍歷新鍊錶確定其m_psibling的指向,o(n)

時間代價為o(n^2),空間代價為0

方法二:

針對方法1中每次確定乙個結點的m_psibling指向效率較低,利用空間換取時間,同樣分兩步1:遍歷一遍鍊錶,用m_pnext指標將鍊錶連起來的同時,將原煉表中的結點n和相應複製結點n'建立雜湊對映

2:再次遍歷一遍原鍊錶,對於每一結點m通過雜湊找到m',並在原煉表中找到m的m_psibling所指向結點,再次通過雜湊查詢找到m'的m_psibling指標應指向的結點,並修改m'的m_psibling指標   

時間代價為o(n), 空間代價為o(n)

方法三:

比較巧妙,只需遍歷3次鍊錶,時間代價為o(n),空間代價為0,分3步1:遍歷一遍原始鍊錶,複製結點n對應的n',將其插入到結點n的後面,如下圖所示

**如下:

[cpp]view plain

copy

print?

void

clonenodes(complexlistnode* phead)  

}  

2:確定每個m_psibling指標的指向,只需遍歷一遍鍊錶即可確定每個結點的m_psibling指標的指向,得到如下圖結構

**如下:

[cpp]view plain

copy

print?

void

connectsiblingnodes(complexlistnode* phead)  

}  

3:再次遍歷一遍,將原始鍊錶和複製鍊錶分開,奇數為原始鍊錶,偶數為複製鍊錶,得到如下圖型

**如下:

[cpp]view plain

copy

print?

complexlistnode* reconnentnodes(complexlistnode* phead)  

while

( pnode )  

return

pclonedhead;  

}  

最終將上述3步合併,就是複製複雜鍊錶的全過程:

[cpp]view plain

copy

print?

complexlistnode* clone(complexlistnode* phead)  

面試題26 複雜鍊錶的複製

1.給定乙個複雜的鍊錶的資料結構,複製這個鍊錶,在這個資料結構中,每個節點有兩個指標,乙個指標指向下乙個結點,另乙個指標指向鍊錶中的任意結點。資料結構 struct complexlistnode 分析 如下圖所示是乙個複雜鍊錶的示意圖,實現標誌指向下一節點的指標,虛線表示指向任意結點的m psib...

面試題26複雜鍊錶的複製

題目 請複製乙個複雜鍊錶。每個結點除了有乙個next指標指向下乙個結點外,還有乙個sibling指向鍊錶中的任意乙個結點。author 大閒人柴毛毛 date 2016年3月16日 public class copylink 複製每個結點,並插入原結點之後 nodep first while p n...

面試題 複雜鍊錶複製

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