輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
# -*- 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
head = phead
p_head = none
new_head = none
#頭結點
random_dic = {}
old_new_dic = {}
while head:
node = randomlistnode(head.label)
#這道題還有乙個要求就是不能用節點引用,一定要建立新的節點
#複製原節點的label到新的鍊錶中
node.random = head.random
#複製原節點的隨機指標到新的鍊錶中
old_new_dic[id(head)] = id(node)
#建立字典,以原節點的記憶體位址作為key,新節點的記憶體位址作為value
random_dic[id(node)] = node
#建立另乙個字典,以新節點的位址作為key,新節點作為value
head = head.next
#將head指向下乙個節點
if new_head:
new_head.next = node
new_head = new_head.next
#給新鍊錶
else:
new_head = node
p_head = node
#當新鍊錶為空時,為新鍊錶的頭結點賦值,這裡比較巧妙的就是phead可以作為頭結點,而new_head可以放心
#向後移動
new_head = p_head
while new_head:
if new_head.random != none:
new_head.random = random_dic[old_new_dic[id(new_head.random)]]
#這裡的問題就是old_new_dic中就沒有id(new_head.random])的鍵,
#因為old_new_dic中的鍵是原節點的位址,但是這裡以新節點的隨機節點指標指向了
#乙個隨機的節點,這樣的話,隨機節點也是原節點中的,因此,這根據隨機節點找到對應的新節點的記憶體位址了,
#然後通過random_dic就找到了新節點了
new_head = new_head.next
#這個迴圈的目的就是找到new_head的random屬性
#現在又出現乙個問題,在上邊,不是已經把head.random賦給了new_head.random嗎?
#那麼進一步推理,存在一種可能,那就是前邊並沒有給new_head賦予屬性random
return p_head
牛客網 複雜鍊錶的複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判斷程式會直接返回空 思路 分為三個步驟 1 根據原始鍊錶中的節點建立新的節點,然後將新的節點連線在對...
牛客網 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 思路參考 苦練演算法 劍指offer 二十 五 複雜鍊錶的複製 python編寫 先複製原...
牛客網刷題之複雜鍊錶
題目描述 現在有乙個這樣的鍊錶 鍊錶的每乙個節點都附加了乙個隨機指標,隨機指標可能指向鍊錶中的任意乙個節點或者指向空。請對這個鍊錶進行深拷貝。題目分析 public class solution 當前節點指向複雜鍊錶的頭結點 randomlistnode curnode head 賦值原始鍊錶,並將...