牛客網18 複雜鍊錶的複製

2021-08-20 23:40:57 字數 1742 閱讀 7502

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