【面试题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个函数。有了这些清晰的思路之后再写代码,就容易多了;
  • 考查分析时间效率和空间效率的能力。当提出第一种第二种思路的时候,此时算法在效率上还不是最优解。这时候要能自己分析出这两种算法的时间复杂度和空间复杂度各是多少。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章