題目描述
給定一個鏈表,每個節點包含一個額外增加的隨機指針,該指針可以指向鏈表中的任何節點或空節點。
要求返回這個鏈表的 深拷貝。
我們用一個由 n 個節點組成的鏈表來表示輸入/輸出中的鏈表。每個節點用一個 [val, random_index] 表示:
val:一個表示 Node.val 的整數。
random_index:隨機指針指向的節點;如果不指向任何節點,則爲 null 。
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
算法思路
因爲是深拷貝,所以不能使用某個節點然後指向原有節點。
如何深拷貝?重新創建節點值和節點關係與原鏈表相同的鏈表。
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
d={None:None}
ad=head
while ad:
d[ad]=Node(ad.val)
ad=ad.next
ad=head
# print(d)
# return
try:
while ad:
d[ad].next=d[ad.next]
# if ad.random==None:
# d[ad].random=None
# else:
d[ad].random=d[ad.random]
# print(ad.val)
ad=ad.next
return d[head]
except Exception as err:
print(err)
完整算法多次出錯,後來通過try-except與print找到錯誤是None不在字典裏。
算法第一部分,先遍歷一遍鏈表並創建映射,記得保存原表頭head。
!一個重要的點是這裏作爲key的節點是可以修改的嗎?實踐證明可以。即使修改了key的屬性,也不影響。
d={None:None}
ad=head
while ad:
d[ad]=Node(ad.val)
ad=ad.next
第二部分是根據鏈表對新創建的節點進行關聯。
while ad:
d[ad].next=d[ad.next]
d[ad].random=d[ad.random]
ad=ad.next
完成。
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
d={None:None}
k=head
while k:
d[k]=Node(k.val)
k=k.next
k=head
while k:
d[k].next=d[k.next]
d[k].random=d[k.random]
k=k.next
return d[head]
執行用時 :44 ms, 在所有 Python3 提交中擊敗了71.11%的用戶
內存消耗 :14.3 MB, 在所有 Python3 提交中擊敗了11.11%的用戶