📅  最后修改于: 2023-12-03 14:50:03.295000             🧑  作者: Mango
这是一个针对克隆带有下一个和随机指针的链表的问题的算法题解。在链表克隆问题中,每个节点都具有两个指针,一个指向下一个节点,另一个随机指向链表中的任意一个节点。这个算法的目的是克隆这个有随机指针的链表,并返回新的链表。
我们需要先遍历一遍链表,将每个节点都克隆一份,并将这些克隆出来的节点插入到原链表中相应的位置上。对于每个克隆出来的节点,它的next
指针要指向下一个克隆出来的节点,它的random
指针则要指向原来节点的random
指针指向的节点的克隆出来的节点。
接下来,我们需要遍历一遍链表,将每个克隆出来的节点的random
指针正确指向相应的克隆节点。最后,我们再将这个链表拆分成两个链表,一个原链表,一个新链表,然后返回新链表即可。
下面是一份Python代码的示例实现:
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
# 遍历一遍链表,克隆每个节点
curr = head
while curr:
curr_copy = Node(curr.val)
curr_copy.next = curr.next
curr.next = curr_copy
curr = curr_copy.next
# 遍历一遍链表,更新克隆节点的random指针
curr = head
while curr:
curr_copy = curr.next
if curr.random:
curr_copy.random = curr.random.next
curr = curr_copy.next
# 拆分链表
curr = head
new_head = head.next
while curr:
curr_copy = curr.next
curr.next = curr_copy.next
if curr_copy.next:
curr_copy.next = curr_copy.next.next
curr = curr.next
return new_head
代码中使用了一个Node
类表示链表中的节点。每个节点都有一个val
属性,一个next
指针指向下一个节点,一个random
指针指向任意一个节点。copyRandomList
方法就是克隆链表的具体实现。首先判断链表是否为空,然后对链表进行三次遍历,分别实现克隆节点、更新random指针、拆分链表三个步骤。最后返回新链表的头节点即可。