【題目】輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
【思路】首先在每個node後面加乙個相同的node,例如 1->2->3->4,變成1->1->2->2->3->3->4->4,假如1的隨機指標指向的是4,那麼複製的1的隨機指標就是1的隨機指標的next,即複製的4。最後將原來的node和複製的node之間的連線斷開,就每個node都指向它下乙個的下乙個。
注意邊界條件
【鍊錶知識】
class
solution
:# 返回 randomlistnode
defclone
(self, phead)
:#在每乙個node後面複製乙個一樣的node
if phead ==
none
:#空的情況
return
none
ptmp = phead
while ptmp:
node = randomlistnode(ptmp.label)
#複製 node.
next
= ptmp.
next
#複製的指向下乙個
ptmp.
next
= node#原來的指向複製的
ptmp = node.
next
#移到下乙個
#實現複製節點的random指標指向
ptmp = phead
while ptmp:
#該節點的下乙個(即複製節點)的隨機指標指向該節點隨機指標指向的下乙個
#該節點有隨機指標才能指向
if ptmp.random:
ptmp.
next
.random = ptmp.random.
next
ptmp = ptmp.
next
.next
#移到下乙個
#斷開node與複製node之間的連線
ptmp = phead
pnewhead = phead.
next
#固定複製鍊錶的頭部,用於輸出
pnewtmp = phead.
next
#從複製的頭部開始,表示複製的鍊錶
while ptmp:
ptmp.
next
= ptmp.
next
.next
#原來node跳過複製節點指向原來的節點
#下乙個是空就不用跳著指向了
if pnewtmp.
next
: pnewtmp.
next
= pnewtmp.
next
.next
pnewtmp = pnewtmp.
next
ptmp = ptmp.
next
return pnewhead
深拷貝
【**實現】
import copy
class
solution
:# 返回 randomlistnode
defclone
(self, phead)
: ret = copy.deepcopy(phead)
return ret
劍指offer 25 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 include include include using namespace std s...
劍指offer 25 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 本題的最簡答的思路就是先實現結點與next指標的複製,然後利用遍歷整個鍊錶尋找每個結點的r...
劍指offer 25 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a1 ran...