返回

化腐朽为神奇,让深拷贝轻易解决难题

前端

一、题目

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。

深拷贝应该正好由 n 个全新的节点组成,这意味着:

每个新节点都指向一个全新的节点,而不是指向原链表中的节点。
新链表中的每个随机指针都指向相应的深拷贝节点。

二、解决思路

要解决链表深拷贝难题,我们可以采用以下步骤:

  1. 克隆节点:首先,我们需要创建一个新链表,并为其分配与原链表相同数量的节点。每个新节点都应该具有与原节点相同的值,但它们的 next 和 random 指针都指向 null 。
  2. 建立映射关系:接下来,我们需要建立一个哈希映射,将原链表中的每个节点映射到新链表中的对应节点。这将帮助我们在稍后设置随机指针。
  3. 设置随机指针:现在,我们可以遍历原链表,并使用哈希映射来找到新链表中每个节点的随机指针。一旦我们找到了对应的节点,我们就可以设置新节点的 random 指针。
  4. 返回新链表:最后,我们可以返回新链表作为深拷贝结果。

三、实现细节

下面是使用 Python 实现上述算法的代码:

def copyRandomList(head):
  """
  :type head: Optional[Node]
  :rtype: Optional[Node]
  """

  # 克隆节点
  new_head = Node(head.val)
  mapping = {head: new_head}

  # 建立映射关系
  curr_old = head.next
  curr_new = new_head
  while curr_old:
    new_node = Node(curr_old.val)
    mapping[curr_old] = new_node
    curr_new.next = new_node
    curr_old = curr_old.next
    curr_new = curr_new.next

  # 设置随机指针
  curr_old = head
  curr_new = new_head
  while curr_old:
    if curr_old.random:
      curr_new.random = mapping[curr_old.random]
    curr_old = curr_old.next
    curr_new = curr_new.next

  # 返回新链表
  return new_head

四、复杂度分析

  • 时间复杂度:O(n),其中 n 为链表的长度。
  • 空间复杂度:O(n),因为我们需要使用哈希映射来存储原链表中的每个节点和其对应的深拷贝节点。

五、总结

链表深拷贝是计算机科学中一个常见的难题。通过使用哈希映射,我们可以有效地解决这个问题。本篇文章介绍的算法简单易懂,易于实现,可以帮助您轻松应对链表深拷贝难题。