使用 Python 中的随机指针复制列表

pythonserver side programmingprogramming更新于 2024/2/18 17:34:00

链表是一种线性数据结构,其中每个节点都有两个块,其中一个块包含节点的值或数据,另一个块包含下一个字段的地址。

假设我们有一个链表,每个节点都包含一个指向列表中其他节点的随机指针。任务是构建与原始列表相同的列表。从具有一些随机指针的原始列表复制列表称为"深度复制"的链表。

例如

输入 1:


输出:

5-> 2 -> 3 -> 7 ->4 ->

解释:

如果我们将给定链表中原始节点的值附加到新列表中,并将原始链表的随机指针替换为新列表中的下一个节点,则它将变成 5-> 2- >3 -> 7-> 4->

解决此问题的方法

我们有一个链表,其节点包含其数据和一个随机指针。为了实现包含数据和随机指针的链表的复制,我们首先将在每个节点后附加具有相同值的新节点。这将在每个节点后创建一个重复节点。

初始化后,检查列表中随机指针的路径,并将随机指针相应地放入新创建的节点中。

现在,将原始列表中的每个节点后的新创建的节点分开,将创建链接列表的深层副本。

  • 获取带有数据字段和指向其随机节点地址的指针的链接列表。
  • 函数 copyRandomList(listnode*head) 将原始列表的头节点作为输入并返回列表的深层副本。
  • 如果头为空,则列表为空,我们也必须返回头。
  • 现在在原始列表的每个节点后插入一个具有相同值的新节点。
  • 然后从原始列表复制随机指针并插入新节点,即 newnode->next = curr->randomPointer
  • 一旦使用指针和数据创建新节点,我们将分离列表并返回列表作为输出。

示例

class listnode:
   def __init__(self, data):
      self.data = data
      self.next = None
      self.random = None
def copyRandomList(head):
   if head is None:
      return head
   # 在原始列表中的每个节点后插入一个具有相同值的新节点。
   curr = head
   while curr != None:
      new = listnode(curr.data)
      new.next = curr.next
      curr.next = new
      curr = curr.next.next

   # 现在将随机指针与新创建的节点放在一起。
   curr = head
   while curr != None:
      curr.next.random = curr.random.next
      curr = curr.next.next

   # 现在让我们将新创建的列表与原始列表分开。
   curr = head
   temp = head.next
   while curr.next != None:
      dummyHead = curr.next
      curr.next = curr.next.next
      curr = dummyHead
   返回 temp
def printList(head):
   curr = head
   while curr != None:
      print(curr.data, " ", curr.random.data)
      curr = curr.next
head = listnode(1)
head.next = listnode(2)
head.next.next = listnode(3)
head.next.next.next = listnode(4)
head.next.next.next.next = listnode(5)
head.random = head.next.next
head.next.random = head
head.next.next.random = head.next.next.next.next
head.next.next.next.random = head.next.next.next.next
head.next.next.next.random = head.next.next.next.next
head.next.next.next.next.random = head.next
print("原始列表:\n")
printList(head)
copiedList = copyRandomList(head)
print("\n 列表的深层复制:")
printList(copiedList)

运行上述代码将生成如下输出,

输出

原始列表:
1 3
2 1
3 5
4 5
5 2
列表的深层复制:
1 3
2 1
3 5
4 5
5 2

相关文章