輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標random指向乙個隨機節點),請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
建立乙個列表l1,將鍊錶的每乙個節點按順序加到列表l1裡面。
建立乙個字典d1,以鍊錶的節點和當前節點的random指標指向的節點分別作為鍵和值,存到字典d1裡面。
按照l1裡面節點的label,建立新的節點並按照l1的順序放到新的列表new_probe裡面。
根據l1和d1的節點關係,將new_probe裡面的節點建立成新的鍊錶,並返回new_probe的第乙個節點。
注意判斷phead是none的情況,否則會報列表越界的錯。
# coding:utf-8
class randomlistnode:
def __init__(self, x):
self.label = x
self.next = none
self.random = noneclass solution:
# 返回 randomlistnode
def clone(self, phead):
if not phead:
return none
probe = phead
l1 =
d1 = {}
# 將next關係儲存到l1
while probe:
probe = probe.next
probe = phead
# 將random關係按照鍵值對存到d1
while probe:
if probe.random:
d1[probe] = probe.random
else:
d1[probe] = -1
probe = probe.next
# 按照l1裡面的節點的值,建立新的節點,並按照l1的順序存放到new_probe
new_probe = [randomlistnode(x.label) for x in l1]
# 給新的節點建立next指標
for i in range(len(new_probe)-1):
new_probe[i].next = new_probe[i+1]
# 給新的節點建立random指標
for i in range(len(new_probe)):
if d1[l1[i]] != -1:
new_probe[i].random = new_probe[l1.index(d1[l1[i]])]
return new_probe[0] if new_probe[0] else none
# 建立鍊錶進行驗證
a = randomlistnode('a')
b = randomlistnode('b')
c = randomlistnode('c')
d = randomlistnode('d')
e = randomlistnode('e')
a.next = b
b.next = c
c.next = d
d.next = e
a.random = c
b.random = d
c.random = a
e.random = d
s = solution()
ret = s.clone(a)
r1 = ret
r2 = ret
while r1:
if r1.random:
print r1.random.label
else:
print none
r1 = r1.next
while r2:
print r2.label
r2 = r2.next
結束!
劍指offer 複雜鍊錶的賦值
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 思路 先賦值原來的鍊錶,不管random,然後把複製到的鍊錶插入元鍊錶,比如a b複製了a...
面試題26 複雜鍊錶的賦值
有乙個複雜鍊錶,其結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任一結點或者null。請完成函式complexnode clone complexnode phead 以複製乙個複雜鍊錶。structcomplexnode include using na...
面試題26 複雜鍊錶的賦值
題目 請實現complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中任意乙個節點。結點定義如下 1 struct complexlistnode...