📌  相关文章
📜  用于克隆具有 Next 和随机指针的链表的Python程序集 2(1)

📅  最后修改于: 2023-12-03 15:40:53.291000             🧑  作者: Mango

用于克隆具有 Next 和随机指针的链表的Python程序集 2

本篇介绍一个Python程序集,用于克隆具有 Next 和随机指针的链表。此程序集基于深度克隆(deepcopy)对链表进行克隆。

代码实现
class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None


class Solution:
    # @param head, a RandomListNode
    # @return a RandomListNode
    def copyRandomList(self, head):
        if not head:
            return None

        # 利用一个字典记录每个节点的克隆节点
        dic = {}

        # 深度克隆原链表中的每个节点
        cur = head
        while cur:
            dic[cur] = RandomListNode(cur.label)
            cur = cur.next

        # 连接克隆节点的 next 和 random 指针
        cur = head
        while cur:
            dic[cur].next = dic.get(cur.next)
            dic[cur].random = dic.get(cur.random)
            cur = cur.next

        # 返回克隆链表的头节点
        return dic[head]
实现思路

该程序集主要依靠深度克隆(deepcopy)对链表进行克隆。在克隆之前,首先需要使用一个字典记录原链表中每个节点的克隆节点,然后在进行克隆的同时,将原链表中每个节点的 next 指针和 random 指针对应的节点克隆节点的 next 指针和 random 指针赋值即可。

使用说明

该程序集需要创建 RandomListNode 类来定义链表中每个节点的结构,具体代码实现如下:

class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None

在克隆链表之前,需要先创建一个原链表的头节点,然后利用 next 指针将所有节点连接起来。接下来,使用 Python 的类实例化该程序集,并传入头节点,即可得到克隆链表的头节点。

具体的使用示例代码如下:

head = RandomListNode(1)
head.next = RandomListNode(2)
head.next.next = RandomListNode(3)
head.random = head.next.next
head.next.random = head

s = Solution()
clone_head = s.copyRandomList(head)

print(clone_head.label)  # 输出:1
print(clone_head.random.label)  # 输出:3
print(clone_head.next.random.label)  # 输出:1