您好,登录后才能下订单哦!
在LeetCode上,复杂链表的复制是一个经典的问题,通常出现在面试题中。这个问题的难点在于链表中不仅包含普通的next
指针,还包含一个random
指针,该指针可以指向链表中的任意节点或null
。我们需要在不破坏原链表结构的情况下,复制出一个新的链表,并且新链表中的random
指针也要正确指向新链表中的节点。
本文将详细介绍如何实现复杂链表的复制,并通过代码示例来帮助理解。
给定一个复杂链表的头节点head
,链表中每个节点除了有一个next
指针指向下一个节点外,还有一个random
指针指向链表中的任意节点或null
。请实现一个函数来复制这个链表,并返回复制后的链表的头节点。
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
在这个示例中,链表的每个节点包含两个指针:next
和random
。我们需要复制这个链表,并确保新链表中的random
指针指向正确的位置。
我们可以使用哈希表来存储原链表节点和新链表节点之间的映射关系。具体步骤如下:
next
和random
指针:再次遍历原链表,根据哈希表中的映射关系,设置新链表中每个节点的next
和random
指针。class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
def copyRandomList(head: 'Node') -> 'Node':
if not head:
return None
# 创建哈希表,存储原节点和新节点的映射关系
mapping = {}
# 第一次遍历,创建新节点并存储映射关系
current = head
while current:
mapping[current] = Node(current.val)
current = current.next
# 第二次遍历,设置新节点的next和random指针
current = head
while current:
if current.next:
mapping[current].next = mapping[current.next]
if current.random:
mapping[current].random = mapping[current.random]
current = current.next
# 返回新链表的头节点
return mapping[head]
我们可以通过原地复制的方式来减少空间复杂度。具体步骤如下:
random
指针:再次遍历链表,设置新节点的random
指针。def copyRandomList(head: 'Node') -> 'Node':
if not head:
return None
# 第一步:复制节点并插入到原节点后面
current = head
while current:
new_node = Node(current.val)
new_node.next = current.next
current.next = new_node
current = new_node.next
# 第二步:设置新节点的random指针
current = head
while current:
if current.random:
current.next.random = current.random.next
current = current.next.next
# 第三步:分离原链表和新链表
current = head
new_head = head.next
while current:
new_node = current.next
current.next = new_node.next
if new_node.next:
new_node.next = new_node.next.next
current = current.next
return new_head
复杂链表的复制问题可以通过哈希表法或原地复制法来解决。哈希表法的思路简单直观,但需要额外的空间来存储映射关系;而原地复制法则通过巧妙地修改链表结构,避免了额外的空间开销。在实际应用中,可以根据具体需求选择合适的方法。
通过本文的介绍,相信读者已经对如何实现复杂链表的复制有了深入的理解。希望这篇文章能够帮助你在LeetCode上顺利解决类似的问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。