我正在尝试反转链接,这是我的实现:
import copy
# ...
def reverse(linked_list):
"""
Reverse the inputted linked list
Args:
linked_list(obj): Linked List to be reversed
Returns:
obj: Reveresed Linked List
"""
if linked_list.head is None:
return linked_list
copy_list = copy.copy(linked_list)
current = copy_list.head
while current.next is not None:
new_head = current.next
tail = current.next.next
new_head.next = copy_list.head
current.next = tail
copy_list.head = new_head
return copy_list
考虑列表按如下方式填充:
myList = LinkedList()
for value in [1, 2, 3, 4, 5]:
myList.append(value)
# myList = [1, 2, 3, 4, 5]
所以myList
现在包含:[1, 2, 3, 4, 5]
- 到目前为止一切顺利..
但后来我反转了它:
reversed = reverse(myList)
# reversed = [5, 4, 3, 2, 1]
# myList = [1]
结果是reversed
确实包含一个反向列表[5, 4, 3, 2, 1]
,但作为副作用,这会将myList
的内容更改为:[1]
。
因此,看起来每当我反转列表时,我也不会使用它的副本,而是在更改原始列表。 不知道为什么,因为我明确创建了一个副本copy_list = copy.copy(linked_list)
然后基于它进行工作。
如果你能给我提示,将不胜感激。
PS:我知道以前也问过类似的问题,但我对一般的解决方案不感兴趣,我更感兴趣的是找出我的实现中出了什么问题。
附加课程:
class Node:
def __init__(self, value):
self.value = value
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, value):
if self.head is None:
self.head = Node(value)
return
node = self.head
while node.next:
node = node.next
node.next = Node(value)
def __iter__(self):
node = self.head
while node:
yield node.value
node = node.next
def __repr__(self):
return str([v for v in self])
我会告诉你简短的答案, 您正在使用具有两个选项的副本库
- 浅拷贝
- 深拷贝
copy.copy 使用浅拷贝,它使用按引用传递,在复制文件中所做的更改也会影响原始文件。
copy.deepcopy 创建了一个新结构,其中新文件中的更改不会影响 原版。