刷題 複雜鍊錶的複製

2021-08-19 20:18:11 字數 2010 閱讀 4020

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