在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 Noneis not None将实例与Nome进行比较,因为您只需要比较身份(内存地址)。
  • 类名应该在CamelCase中,
  • 变量和函数名称应为snake_case。
  • 避免在代码中使用next,因为它是一个内置函数,也可能令人困惑(例如,用next_node替换)。

以上是关于在python中反转链接列表的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的反转字符串:reversed()切片等

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

python 列表之删除反转

python 反转列表

13 个非常有用的 Python 代码片段

在Python中随机反转列表列表中的一半单词