克隆一个包含随机指针的链表是一个复杂的问题,因为它涉及到不仅要复制节点的值和下一个指针,还要复制随机指针指向的节点。下面是解决这个问题的基础概念、步骤和相关代码示例。
null
。克隆包含随机指针的链表通常有两种方法:使用哈希表和使用拼接。
next
和random
指针。优势:逻辑简单,易于理解。 应用场景:适用于链表不是特别长的情况。
代码示例:
class Node:
def __init__(self, val, next=None, random=None):
self.val = val
self.next = next
self.random = random
def copyRandomList(head):
if not head:
return None
# 创建一个哈希表来存储原始节点和新节点的映射
node_map = {}
# 第一次遍历:创建所有节点的副本并存储在哈希表中
current = head
while current:
node_map[current] = Node(current.val)
current = current.next
# 第二次遍历:设置新节点的next和random指针
current = head
while current:
if current.next:
node_map[current].next = node_map[current.next]
if current.random:
node_map[current].random = node_map[current.random]
current = current.next
return node_map[head]
random
指针。优势:不需要额外的存储空间来存储映射关系。 应用场景:适用于内存受限的环境。
代码示例:
class Node:
def __init__(self, val, next=None, random=None):
self.val = val
self.next = next
self.random = random
def copyRandomList(head):
if not head:
return None
# 第一次遍历:在每个节点后面插入新节点
current = head
while current:
new_node = Node(current.val, 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
# 第三次遍历:拆分原始链表和新链表
new_head = head.next
current = head
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
如果在克隆过程中遇到问题,比如新节点的random
指针没有正确设置,可能是因为在遍历链表时遗漏了某些节点或者错误地设置了指针。检查代码逻辑,确保每个节点都被正确处理,并且指针设置无误。
克隆包含随机指针的链表是一个挑战性的问题,但通过上述两种方法可以有效地解决。选择哪种方法取决于具体的应用场景和内存限制。
领取专属 10元无门槛券
手把手带您无忧上云