gpt4 book ai didi

python - Python 中双向链表的深拷贝

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:24 25 4
gpt4 key购买 nike

我在为 DoublyLinkedList 类实现深层复制方法时遇到问题。深拷贝应该返回一个新的、原始的双向链表,它不引用原始 DLL(与浅拷贝不同)。

这是我目前所拥有的:

class EmptyCollection(Exception):
pass


class DoublyLinkedList:
class Node:
def __init__(self, data=None, next=None, prev=None):
self.data = data
self.next = next
self.prev = prev

def disconnect(self):
self.data = None
self.next = None
self.prev = None

def __init__(self):
self.header = DoublyLinkedList.Node()
self.trailer = DoublyLinkedList.Node()
self.header.next = self.trailer
self.trailer.prev = self.header
self.size = 0

def __len__(self):
return self.size

def is_empty(self):
return (len(self) == 0)

def first_node(self):
if (self.is_empty()):
raise EmptyCollection("List is empty")
return self.header.next

def last_node(self):
if (self.is_empty()):
raise EmptyCollection("List is empty")
return self.trailer.prev

def add_first(self, elem):
return self.add_after(self.header, elem)

def add_last(self, elem):
return self.add_after(self.trailer.prev, elem)

def add_after(self, node, elem):
prev = node
succ = node.next
new_node = DoublyLinkedList.Node()
new_node.data = elem
new_node.prev = prev
new_node.next = succ
prev.next = new_node
succ.prev = new_node
self.size += 1
return new_node

def add_before(self, node, elem):
return self.add_after(node.prev, elem)

def delete(self, node):
prev = node.prev
succ = node.next
prev.next = succ
succ.prev = prev
self.size -= 1
data = node.data
node.disconnect()
return data

def __iter__(self):
if(self.is_empty()):
return
cursor = self.first_node()
while(cursor is not self.trailer):
yield cursor.data
cursor = cursor.next

def __str__(self):
return '[' + '<-->'.join([str(elem) for elem in self]) + ']'

def __repr__(self):
return str(self)




def deepCopy(lnk_lst):
currenthead = lnk_lst.first_node()
temp = DoublyLinkedList()
while currenthead is not lnk_lst.trailer:
temp.add_last(currenthead.data)
currenthead = currenthead.next
return temp


lnk_lst1 = DoublyLinkedList()
elem1 = DoublyLinkedList()
elem1.add_last(1)
elem1.add_last(2)
lnk_lst1.add_last(elem1)
elem2 = 3
lnk_lst1.add_last(elem2)
lnk_lst2 = deepCopy(lnk_lst1)
e1 = lnk_lst1.first_node()
e1_1 = e1.data.first_node()
e1_1.data = 10
e2 = lnk_lst2.first_node()
e2_1 = e2.data.first_node()
print(e2_1.data) #should print 1

我的深拷贝方法似乎返回一个浅拷贝。程序的输出应为 1(因为 lnk_lst2 不应引用 lnk_lst1 中的任何元素。)

有人可以解释我如何修改我的深拷贝方法来生成链表的深拷贝而不是浅拷贝吗?

我不能为此使用 python 的内置深拷贝或浅拷贝。任何帮助将不胜感激。

最佳答案

要执行深拷贝,你需要拷贝嵌入的链表:

def deepCopy(lnk_lst):
currenthead = lnk_lst.first_node()
temp = DoublyLinkedList()
while currenthead is not lnk_lst.trailer:
if isinstance(currenthead.data, DoublyLinkedList):
temp.add_last(deepCopy(currenthead.data))
else:
temp.add_last(currenthead.data)
currenthead = currenthead.next
return temp

关于python - Python 中双向链表的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47083204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com