使用 C++ 克隆具有 next 和 Random 指针的链表

2025年3月17日 | 阅读 3 分钟

在本文中,您将学习如何在 C++ 中克隆带有 next 和 Random 指针的链表

  • 大小为 N 的链表中的每个节点都有两个连接:一个指向紧随其后的节点,另一个可以指向列表中的任何其他节点。这个链表必须在 O(N) 时间内复制。
  • 请记住,“arbit”指针可能会随机指向链表中的任何节点,而“next”指针指向链表中跟随的节点。
  • 下图显示了一个链表示例
Clone a Linked List with next and Random Pointer in C++

使用额外空间克隆带有 next 和 Random 指针的链表

  • 为了将新节点映射到当前链表中匹配的节点,必须首先创建一个仅由“next”指针组成的单链表。通过此映射,您可以使用新创建列表中的任何节点指向任何其他节点。

要应用上述想法,请执行以下操作

  • 复制每个节点(假设为 X),假设为 Y,然后将每个节点映射到其对应的旧节点(假设为 mp),以便 mp[X] = Y。
  • 对于每个节点,仅使用“next”引用,它会创建一个重复节点的单链表。

对于前面的链表迭代,请再次遵循这些步骤

  • 识别与主节点链接的冗余节点。(例如,如果 X 是当前节点,则 mp[x] 是重复节点。)
  • 将当前->arbit 节点的重复节点的 arbit 指针设置为指向该节点的重复节点(使得 mp[x]->arbit 指向 mp[X->arbit])。

所需的链表,即一个链表,通过此过程创建。

为了澄清,请参考下图

图解

考虑下面显示的链表

Clone a Linked List with next and Random Pointer in C++
  • arbit 指针是绿色链接。

制作节点和 next 指针的副本

  • 首先创建一个重复节点的单链表,仅使用 next 指针将新节点映射到旧节点。
  • 这里,映射通过蓝色链接显示。
Clone a Linked List with next and Random Pointer in C++

链接 arbit 指针

如技术中所述,现在遍历旧数组并更改 arbit 指针。 arbit 指针是绿色链接。

在第一个节点

Clone a Linked List with next and Random Pointer in C++

在第二个节点

Clone a Linked List with next and Random Pointer in C++

在第三个节点

Clone a Linked List with next and Random Pointer in C++

在第四个节点

Clone a Linked List with next and Random Pointer in C++

在第五个节点

Clone a Linked List with next and Random Pointer in C++

最终的链表如下图所示

Clone a Linked List with next and Random Pointer in C++

程序

让我们举一个例子来演示如何在 C++ 中克隆带有 next 和 random 指针的链表。

输出

Clone a Linked List with next and Random Pointer in C++