在python中反转LinkedList

时间:2017-12-30 07:45:55

标签: python linked-list

class node:
    def __init__(self, data = None):
        self.data = data
        self.next = None

class linked_list:
    def __init__(self):
        self.head = node()

这是我在python中初始化LinkedList数据结构的方法。

在我添加一些节点后,执行

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,看起来很好,我不知道我做错了什么。

2 个答案:

答案 0 :(得分:1)

反向

查看您的运营顺序:

curr.next = prev
prev = curr
curr = curr.next

在执行curr = curr.next之前,curr.next等于prev,等于无(在第一次和最后一次迭代期间)。

在更改之前,您需要将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

答案 1 :(得分:0)

如@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替换)。