反转链表问题



我正在尝试反转链接,这是我的实现:

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])

我会告诉你简短的答案, 您正在使用具有两个选项的副本库

  1. 浅拷贝
  2. 深拷贝

copy.copy 使用浅拷贝,它使用按引用传递,在复制文件中所做的更改也会影响原始文件。

copy.deepcopy 创建了一个新结构,其中新文件中的更改不会影响 原版。

相关内容

  • 没有找到相关文章

最新更新