輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
第一反應:分兩步。第一步考慮next,第二步考慮random。利用雜湊表建立對映關係。
# -*- coding:utf-8 -*-
# class randomlistnode:
# def __init__(self, x):
# self.label = x
# self.next = none
# self.random = none
class
solution:
# 返回 randomlistnode
defclone
(self, phead):
# write code here
if phead:
p1 = phead
p2 = randomlistnode(p1.label)
pheadnew = p2
hashmap = {}
while p1.next:
hashmap[p1] = p2
p2.next = randomlistnode(p1.next.label)
p1 = p1.next
p2 = p2.next
hashmap[p1] = p2
p1 = phead
p2 = pheadnew
while p1:
if p1.random in hashmap:
p2.random = hashmap[p1.random]
p1 = p1.next
p2 = p2.next
return pheadnew
else:
return
none
高階版:將複製的每個結點接在對應原始結點的後面,複製結點random指標與原始結點random指標指向的位置應該是相鄰的,最後將鍊錶拆為原始鍊錶和複製鍊錶。
# -*- coding:utf-8 -*-
# class randomlistnode:
# def __init__(self, x):
# self.label = x
# self.next = none
# self.random = none
class
solution:
# 返回 randomlistnode
defclone(self, phead):
# write code here
ifphead:
p1 = phead
while
p1: p2 = randomlistnode(p1.label)
p2.next = p1.next
p1.next = p2
p1 = p2.next
p1 = phead
while
p1: p2 = p1.next
if p1.random:
p2.random = p1.random.next
p1 = p2.next
p1 = phead
pheadnew = p2 = p1.next
p1.next = p2.next
p1 = p1.next
while
p1: p2.next = p1.next
p2 = p2.next
p1.next = p2.next
p1 = p1.next
return pheadnew
else:
return
none
刷題 複雜鍊錶的複製
一 題目 二 重點難點分析 1.怎麼確定random在新的節點的位置 2.為什麼要用map?答 map函式有鍵值關係,先確定好舊鍊錶的鍵值關係,在從新的煉表裡利用舊煉表裡的鍵key配對random 就是值 3.new 乙個map出來,按著 node,node.val 傳入進到map裡 node是he...
刷題之路 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head 三步走 第一步,複製鍊錶節點a b c 變為 a a b b c c 目的為了第二步 第二步,重建random指標位置,此時,複製後的指標指向的位置應該就是原節...
刷題筆記(十二) 複雜鍊錶複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 思路 開始沒大看懂題啥意思,看了給定的結構體才明白。首先將各個節點進行複製a a 並將複製...