【面試題35】複雜鏈表的複製

在這裏插入圖片描述
Python解法
1)根據next指針,複製每個結點,放在原結點後面;2)複製random指針;3)分裂爲新老兩個鏈表。

# -*- 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):
        def CloneNode(pHead):
            cur = pHead
            while cur != None:
                newNode = RandomListNode(cur.label)
                newNode.next = cur.next
                newNode.random = None
                cur.next = newNode
                cur = newNode.next
        def ConnectSiblingNodes(pHead):
            cur = pHead
            while cur != None:
                newNode = cur.next
                if cur.random != None:
                    newNode.random = cur.random.next
                cur = newNode.next
        def ReconnectNodes(pHead):
            cur = pHead
            res = None
            newNode = None
            if cur != None:
                res = newNode = cur.next
                cur.next = newNode.next
                cur = cur.next
            while cur != None:
                newNode.next = cur.next
                newNode = newNode.next
                cur.next = newNode.next
                cur = cur.next
            return res
        CloneNode(pHead)
        ConnectSiblingNodes(pHead)
        return ReconnectNodes(pHead)

考點

  • 考查對複雜問題的思維能力。本題中的複雜鏈表是一種不太常見的數據結構,而且複製這種鏈表的過程也較爲複雜。我們把複雜鏈表的複製過程分解成3個步驟,同時把每個步驟都用圖形化的方式表示出來,這樣能幫助我們釐清思路。在寫代碼的時候,我們爲每個步驟定義一個子函數,最後在複製函數中先後調用這3個函數。有了這些清晰的思路之後再寫代碼,就容易多了;
  • 考查分析時間效率和空間效率的能力。當提出第一種第二種思路的時候,此時算法在效率上還不是最優解。這時候要能自己分析出這兩種算法的時間複雜度和空間複雜度各是多少。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章