面試題26複雜連標的複製

2021-08-01 20:49:12 字數 1352 閱讀 3949

題目:有乙個複雜鍊錶,其結點除了有乙個m_pnext

指標指向下乙個結點外,還有乙個

m_psibling

指向鍊錶中的任一結點或者

null

。其結點的

c++定義如下:

struct

complexnode

;下圖是乙個含有

5個結點的該型別複雜鍊錶。圖中實線箭頭表示

m_pnext

指標,虛線箭頭表示

m_psibling

指標。為簡單起見,指向

null

的指標沒有畫出。

請完成函式

complexnode* clone(complexnode* phead)

,以複製乙個複雜鍊錶。

分析: 此題目已經有很多人在blog上做過分析, 我沒有乙個比較精練的, 在次我描述出我的想法. 僅供參考.

這個題目的難點在於如何對m_psibling指標複製, 使新的列表具有和原列表同樣的結構.

如原列表是abcde, clone列表是abcde. 

難點在於:如何複製虛線部分的指標.

其實有個很巧妙的方法, 給a,b,c,d,e編號, 分別為0,1,2,3,4.如果所示. 這樣m_psibling的clone就很簡單.

for example:

節點 b 對應的是原節點b, b->m_psibling 是e, e的編號是4. 這樣新列表的第4個節點的位址賦給b->m_psibling就可以了.

但關鍵一點是原列表每個節點的編號儲存在哪呢? 如果編號沒有地方儲存, 也不能降低clone的複雜度. 我們注意到沒每個節電有乙個m_nvalue成員, 我們可以利用它來做文章. 即首先把每個節電的m_nvalue備份出來, 臨時用來儲存編號, 等clone完成後, 再restore.

同時還要把a,b,c.d,e的位址也按順序儲存在乙個陣列裡,以方便獲取他們的位址.

#includeusing namespace std;

struct complexnode

;void clonenodes(complexnode* head)

}void connectsiblingnodes(complexnode* head)

}complexnode* reconnectnode(complexnode* head)

while(node!=null)

return clonehead;

}complexnode* clone(complexnode* head)

面試題26 複雜鍊錶的複製

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

面試題26 複雜鍊錶的複製

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

面試題26複雜鍊錶的複製

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