;以下圖為5個結點的複雜鍊錶,實線表示m_pnext指標的指向,虛線表示m_psibling指標的指向
解法一:
分兩步1:遍歷一遍鍊錶,用m_pnext指標將鍊錶連起來,o(n)
2:假設原始鍊錶中的某節點n的m_psibling指向結點s,由於s的位置在鍊錶上有可能在n的前面也可能在n的後面,所以要定位n的位置需要從原始鍊錶的頭結點開始找,假設從原始鍊錶的頭結點開始經過s步找到結點s,那麼在複製鍊錶上結點n的m_psibling的s』,離複製鍊錶的頭結點的距離也是s,用這種辦法我們就能為複製鍊錶上的每個結點設定m_psibling了。
對含有n
個結點的鍊錶,由於定位每個結點的
m_psibling
都需要從煉表頭結點開始經過
o(n)
步才能找到,因此這種方法的總時間複雜度是
o(n2)
時間代價為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的後面,如下圖所示
**如下:
void clonenodes(complexlistnode* phead)
}
2:確定每個m_psibling指標的指向,假設原始鍊錶上的n的m_psibling指向節點s,那麼其對應複製出來的n'是n的m->pnext指向的節點,同樣s'也是s的m->pnext指向的節點,
這就是我們在上一步中把每個結點複製出來的結點鏈結在原始結點後面的原因。有了這樣的鏈結方式,我們就能在
o(1)
中就能找到每個結點的
m_psibling
了。得到如下圖結構
**如下:
void connectsiblingnodes(complexlistnode* phead)
}
3:再次遍歷一遍,將原始鍊錶和複製鍊錶分開,奇數為原始鍊錶,偶數為複製鍊錶,得到如下圖型
**如下:
complexlistnode* reconnentnodes(complexlistnode* phead)
while ( pnode )
return pclonedhead;
}
最終將上述3步合併,就是複製複雜鍊錶的全過程:
complexlistnode* clone(complexlistnode* phead)
劍指Offer 面試題26 複雜鍊錶的複製
複雜鍊錶的複製 請事先函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標 指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。a b c d e 兄弟指向 a指向...
《劍指Offer》面試題26 複雜鍊錶的複製
劍指offer 面試題26 複雜鍊錶的複製 分解複雜問題 請實現乙個函式用於複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。結點的c 定義如下 複雜鍊錶結點定義 struct complexlistn...
(劍指Offer)面試題26 複雜鍊錶的複製
請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個pnext指標指向下乙個結點之外,還有乙個psibling指向鍊錶中的任意結點或者null。結點的定義如下 struct complexlistnode...