劍指offer 25複雜鍊錶的複製(Python)

2021-10-03 02:43:05 字數 1794 閱讀 1771

【題目】輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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...