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