Python 如何克隆链接列表?
下面是一个链表的基本示例,如下所示 头部->[4]->[6]->[8]->无Python 如何克隆链接列表?,python,data-structures,linked-list,Python,Data Structures,Linked List,下面是一个链表的基本示例,如下所示 头部->[4]->[6]->[8]->无 class Node: def __init__(self, data, next = None): self.data = data self.next = next class LL: def __init__(self): self.head = None def insert_tail(self, o): new_n
class Node:
def __init__(self, data, next = None):
self.data = data
self.next = next
class LL:
def __init__(self):
self.head = None
def insert_tail(self, o):
new_node = Node(o)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next != None:
current = current.next
current.next = new_node
def __str__(self):
result = ''
current = self.head
while current != None:
result = result + str(current.data) + ", "
current = current.next
return result[:-2]
def clone(self, empty):
'''(LL, NoneType) -> LL
'''
empty = LL()
current = self.head
while current != None:
empty.insert_tail(None)
current = current.next
return empty
a = LL()
a.insert_tail(4)
a.insert_tail(6)
a.insert_tail(8)
print(a)
我的问题是,我如何在不改变原始链表的情况下克隆它?哦,我不想使用任何内置的数据结构来实现这一点,因为没有列表、字典、元组等(也没有导入)
编辑:我不想克隆数据,我只想要一个链接列表,如:
head[]->[]->[]->[]->None(这是上面一个的克隆)首先,您的列表不太理想。实施链表时,您应该:
O(1)
O(1)
,在您的示例中是O(n)
)创建一个空列表并遍历现有列表。对于现有列表中的每个元素,只需将其添加到新列表的末尾即可。克隆链接列表的最基本方法是逐项遍历列表,并在运行时创建一个新的链接列表,在尾部插入新元素,就像通常一样。创建
LL
类的新实例,然后使用insert\u tail()
方法从要克隆的列表中添加项目
如果希望克隆数据
属性,以便克隆的列表不会与原始列表交互,那么必须在Python中采用深度复制
值得注意的是,在整个链接列表中使用深度副本可能会更简单,但是,根据您试图完成的任务,您的里程可能会有所不同。真不敢相信我忘记了python作为标记,Whoopsie作为旁注,您真的应该将类命名为
LinkedList
或更具描述性的名称。@NPE我的克隆方法就是我管理的方法。设备应该保存在注释中。OP并没有问如何优化它们的实现。我还没有启动算法,所以我不知道你所说的O(1)是什么意思。@Ali89 O(1)表示该操作独立于列表的长度(时间常数)。请注意,在您的示例中,若列表中有N个项目,则添加新项目需要遍历整个列表。这意味着这个操作在时间上是O(N)->它需要的时间与列表的长度成正比。我只是想复制指针,我不在乎数据中有什么。我不知道他们不能互换,我做了一个编辑。@Ali89我已经给出了答案;遍历列表,通过在尾部附加相同的方法创建一个新列表。你不想复制指针,你想创建新的指针;复制的指针将指向旧的链表元素。您好。如果您在“编辑”中查看我的新链接列表,请使用我的克隆方法。正确吗?不,使用类中已有的方法。创建一个新的LL
实例和insert_tail()
目标列表中您试图克隆的所有项目。您好。你是说像那样吗?