📌  相关文章
📜  克隆带有下一个和随机指针的链表 |设置 1(1)

📅  最后修改于: 2023-12-03 14:50:03.295000             🧑  作者: Mango

克隆带有下一个和随机指针的链表 |设置 1

介绍

这是一个针对克隆带有下一个和随机指针的链表的问题的算法题解。在链表克隆问题中,每个节点都具有两个指针,一个指向下一个节点,另一个随机指向链表中的任意一个节点。这个算法的目的是克隆这个有随机指针的链表,并返回新的链表。

思路

我们需要先遍历一遍链表,将每个节点都克隆一份,并将这些克隆出来的节点插入到原链表中相应的位置上。对于每个克隆出来的节点,它的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指针、拆分链表三个步骤。最后返回新链表的头节点即可。