在python中反转链接列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python中反转链接列表相关的知识,希望对你有一定的参考价值。
class node:
def __init__(self, data = None):
self.data = data
self.next = None
class linked_list:
def __init__(self):
self.head = node()
这是我在python中初始化Linked List数据结构的方法。
在我添加一些节点后,通过执行
my_list.append(1)
my_list.append(2)
my_list.append(3)
my_list.append(4)
并使用我写的功能显示它,
def display(self):
elems = []
curr = self.head
while curr.next != None:
curr = curr.next
elems.append(curr.data)
print(elems)
它打印出[1, 2, 3, 4]
似乎很好。
但是,当我尝试使用下面的函数来反转它时
def reverseList(self):
curr = self.head
prev = None
while curr != None:
curr.next = prev
prev = curr
curr = curr.next
self.head = prev
它给了我一个空的linkedList []
。如果我在纸上画出LinkedList,看起来很好,我看不出我做错了什么。
答案
相反
查看您的运营顺序:
curr.next = prev
prev = curr
curr = curr.next
在你做curr = curr.next
之前,curr.next
等于prev
,它等于None(在第一次和最后一次迭代期间)。
在更改之前,您需要将curr.next
的值存储在中间变量中。
或者,您可以使用Python的多重赋值(Multiple assignment and evaluation order in Python)在评估其值后立即分配所有变量:
curr.next, prev, curr = prev, curr, curr.next
显示
您在显示功能中遇到同样的问题。
while curr.next != None:
curr = curr.next
elems.append(curr.data)
你不附加第一个curr.data
,你直接将curr
改为curr.next
。
另一答案
正如@bazzells所提到的,您需要第三个变量来在丢弃之前跟踪下一个节点:
def reverse(self):
curr = self.head
prev = None
while curr is not None:
next_ = curr.next
curr.next = prev
prev = curr
curr = next_
self.head = prev
代码风格注意事项:
- 使用
is None
或is not None
将实例与Nome
进行比较,因为您只需要比较身份(内存地址)。 - 类名应该在CamelCase中,
- 变量和函数名称应为snake_case。
- 避免在代码中使用
next
,因为它是一个内置函数,也可能令人困惑(例如,用next_node
替换)。
以上是关于在python中反转链接列表的主要内容,如果未能解决你的问题,请参考以下文章