1. 程式人生 > 實用技巧 >複雜連結串列的賦值

複雜連結串列的賦值

題目描述

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標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 = None

class Solution: # 返回 RandomListNode def Clone(self, pHead): if not pHead: return None probe
= pHead l1 = [] d1 = {}
# 將next關係儲存到l1
while probe: l1.append(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

結束!