給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的 深拷貝。
我們用乙個由 n 個節點組成的鍊錶來表示輸入/輸出中的鍊錶。每個節點用乙個 [val, random_index] 表示:
輸入的是head節點。原題描述有點歧義。
示例 1:
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]
示例 3:
輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]
示例 4:
輸入:head =
輸出:解釋:給定的鍊錶為空(空指標),因此返回 null。
不要企圖重新建立乙個鍊錶,因為random指向任意某乙個節點,你無法找到那個節點(當然用索引記錄也能找到,想想都很麻煩)。就看例3裡,三個節點值都是3,完全一樣,你怎麼知道random指向哪個?
so,得想個辦法,比較方便地找到random指向的那個節點。新建鍊錶不行,那就從原鍊錶入手。直接看題解:
"""
# definition for a node.
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':
if head is none:
return none
# 第一步:abc->aabbcc
cur = head
while cur:
nex = cur.next
cur.next = node(cur.val)
cur.next.next = nex
cur = cur.next.next
# 第二步:新增random指標
cur = head
while cur:
cur.next.random = cur.random.next if cur.random else none
cur = cur.next.next
# 第三步:提取新鍊錶
head1 = cur = head.next
while cur.next: # 注意終止條件
head.next = head.next.next
cur.next = cur.next.next
head = head.next
cur = cur.next
head.next = none
return head1
exit return 指標指向NULL
null指標指向的位址為0x00000000,其實內在中位址的範圍是0x00000000 0xffffffff,位址中的每乙個位元組都可以儲存東西。但是系統出於某些原因考慮,0x00000000這個位址不用。所以返回指標為null一般代表錯誤,很多函式返回其它值是正確的位址。null指標是不指向任何...
複製帶隨機指標的鍊錶
給出乙個鍊錶,每個節點包含乙個額外增加的隨機指標可以指向鍊錶中的任何節點或空的節點。返回乙個深拷貝的鍊錶。public randomlistnode copyrandomlist randomlistnode head hashmapmap new hashmap randomlistnode du...
複製帶隨機鍊錶的指標
題目要求 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。這道題我知道的有兩種解法 一種是遍歷鍊錶,找到每乙個節點的隨機指標,但是這樣做時間複雜度是o n 2 另外一種是拷貝節點的方法,下面我用一幅圖具體講一下節點的拷貝思路。下面配...