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,看起来很好,我不知道我做错了什么。
答案 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 None
或is not None
将实例与Nome
进行比较,因为您只需要比较身份(内存地址)。next
,因为它是内置函数,也可能令人困惑(例如,由next_node
替换)。