輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
結點結構體如下:
/*struct randomlistnode
};*/
這是一道劍指offer上的題目。下面看一下解析吧。
在做這道題之前,自己的想法是先把鍊錶中的next域全部複製,這時候原複雜鍊錶的random域的所有指向都會存在於剛才複製的鍊錶中,之後再遍歷原複雜鍊錶,將新鍊錶random域與原鍊錶random域相互對應即可。
但是過程中問題就出現了,雖然我可以在將原鍊錶的所有next域全部複製,也保證了即將要複製的random域的指向存在於該鍊錶中,但是random域是隨機指的,也就是說並不知道當前的random域指向的結點在前面還是後面,如此一來,如果還要繼續下去,恐怕還要巢狀一層迴圈。
為此,又在網上找了大神的部落格參考下,真的是受益匪淺。
想想我們平時複製貼上一段文字的時候是怎麼做的?是照著那段文字乙個乙個的再敲一次嗎?並不是,很顯然,我們是直接在該段文字上覆制,然後將複製後的文字貼上到我們想要的地方。
上面的笨辦法顯然就是乙個乙個的再敲乙個鍊錶出來,並沒有做真正的複製。
那怎麼做?對,就是直接在原煉表上覆制乙份鍊錶,最後將我們想要的備份鍊錶從原煉表中抽離出來。
具體分三個步驟:
1.再原鍊錶的每個結點後面插入乙個與當前結點資料域相同的結點完整**如下2.複製random域的對應關係
3.抽離鍊錶
randomlistnode* clone(randomlistnode*phead)randomlistnode *head =null;
randomlistnode *p, *pf =null;
randomlistnode *q;
//先複製結點
for(p = phead; p; p = p->next->next)
//複製random域對應關係
for(p = phead; p; p = p->next->next)
else
}//抽離鍊錶
head = phead->next;
for(p = phead, q = head; q; q = q->next)
}return
head;
}
end。
鍊錶 複雜鍊錶的複製
問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...
複製複雜鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...