📅  最后修改于: 2023-12-03 15:11:16.262000             🧑  作者: Mango
克隆一个具有 Next 和随机指针的链表是一项基本的面试题。但是如果不了解如何克隆具有随机指针的链表,这可能是一项非常困难的任务。本文将讨论如何在 O(1) 空间中克隆具有 Next 和随机指针的链表。
给定一个链表,其中每个节点除了 next 指针外还有一个 rand 指针,可以指向链表中的任何节点或 null。
请克隆此链表。
克隆链表的过程需要遍历链表两次。在第一次遍历中,我们将每个节点的副本插入到原始节点的后面。在第二次遍历中,我们连接随机指针和副本节点。最后,我们将副本节点从原始链表中分离出来,以免影响链表的原有结构。
由于我们只使用了 O(1) 空间复杂度来存储我们的副本节点,因此算法的总空间复杂度为 O(n)。我们还需要 O(n) 的时间复杂度,因为我们必须遍历原始链表两次。
以下是克隆具有 Next 和随机指针的链表的 Python 代码实现:
class RandomListNode(object):
def __init__(self, x):
self.label = x
self.next = None
self.random = None
class Solution(object):
def clone(self, head):
"""
:type head: RandomListNode
:rtype: RandomListNode
"""
if head is None:
return None
current_node = head
# Insert copy nodes after the original nodes.
while current_node is not None:
new_node = RandomListNode(current_node.label)
new_node.next = current_node.next
current_node.next = new_node
current_node = new_node.next
# Connect the random pointer with copy nodes.
current_node = head
while current_node is not None:
if current_node.random is not None:
current_node.next.random = current_node.random.next
current_node = current_node.next.next
# Disconnect the original and copy nodes.
current_node = head
new_head = head.next
while current_node is not None:
copy_node = current_node.next
current_node.next = copy_node.next
if copy_node.next is not None:
copy_node.next = copy_node.next.next
current_node = current_node.next
return new_head
没有相应的数据结构支持,对于链表的操作可能会比数组等数据结构更棘手。克隆具有 Next 和随机指针的链表是这样一个问题,但是这篇文章介绍了一种用于在 O(1) 空间中克隆具有 Next 和随机指针的链表的 Python 算法。