分析讓複雜問題簡單 複雜鍊錶的複製

2021-09-13 01:32:33 字數 3157 閱讀 5921

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

思路:1,如果鍊錶為空鍊錶,則返回本身即可。

2,如果鍊錶非空的情況:如果沒有特殊指標,則只需要複製。如果含有特殊指標,需要技巧。

思路1:

首先複製原來的鍊錶,順次連線形成新的鍊錶。

#完成第一步的核心操作

node = randomlistnode(clonode.label)

node.next = clonode.next

clonode.next = node

clonode = node.next #下一次操作

第二步,利用原節點的random指向,來用複製的相應節點的random

node = clonode.next #指向複製的結點

if clonode.random: #如果原節點有特殊指標

node.random = clonode.random.next #則複製的節點的特殊指標指向原節點的特殊指標指向的下乙個值 看圖更好理解一些

clonode = node.next

最後一步,將複製好的鍊錶拆分出來,或者說將 偶數字的節點重新拆分合成新的鍊錶,得到的就是複製的鍊錶

#完成第三步的核心操作 此時節點指向隔了乙個節點的節點

node = clonode.next

clonode.next = node.next

clonode = node #下乙個節點的操作

總程式如下:

// an highlighted block

class

solution

: # 返回 randomlistnode

def clone

(self, phead)

: # write code here

if not phead:

return phead

##########首先複製原來的鍊錶,順次連線形成新的鍊錶。##################

clonode = phead

while clonode:

node =

randomlistnode

(clonode.label)

node.next = clonode.next

clonode.next = node

clonode = node.next

#######第二步,利用原節點的random指向,來用複製的相應節點的random######

clonode = phead

while clonode:

node = clonode.next

if clonode.random:

node.random = clonode.random.next

clonode = node.next

#######最後一步,將複製好的鍊錶拆分出來,或者說將 偶數字的節點重新拆分合成新的鍊錶,得到的就是複製的鍊錶##########

clonode = phead

phead = phead.next

while clonode.next:

node = clonode.next

clonode.next = node.next

clonode = node

return phead

python實現2:

// an highlighted block

def iter_node

(root)

:while root:

yield root

root = root.next

class

solution

: # 返回 randomlistnode

def clone

(self, phead)

: # write code here

mem =

dict()

for i,n in

enumerate

(iter_node

(phead)):

mem[

id(n)

]= i

lst =

[randomlistnode

(n.label)

for n in

iter_node

(phead)

]for t,f in

zip(

iter_node

(phead)

,lst)

:if t.next:

f.next = lst[mem[

id(t.next)]]

if t.random:

f.random = lst[mem[

id(t.random)]]

return lst[0]

if lst else none

35 複雜鍊錶的複製( 分解讓複雜問題簡單)

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 測試用例 功能測試 節點中的random指向自身 兩個節點的random形成環狀...

(複雜問題分步驟)劍指 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 占用記憶體 9400k public class randomlistnode publi...

分析讓複雜問題簡單 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。思路 python 實現 an highlighted b...