題目:有乙個複雜鍊錶,其結點除了有乙個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...