對於這個題,基本會有三個思路:
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...