複雜鍊錶的賦值

2021-10-24 17:32:17 字數 1992 閱讀 1959

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標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...