嗨,大家能不能告诉我为什么这段代码不能用于逆转linkedlist,我尝试了我自己的方式来解决,但不明白我做错了什么。
def reverselist(self):
temp=self.start
cur=None
prev=None
nxt=None
while(temp!=None):
nxt=temp.next
cur=temp
cur.next=prev
prev=cur
temp=temp.next
看看这些赋值。
cur=temp
cur.next=prev
prev=cur
temp=temp.next
真正改变列表的是: cur.next=prev
. 在那里,你做的 next
指针指向后方。但后来 之后 变化,你做 temp=temp.next
. 所以你要把 修改 .next
值在这里。
如果这还不能说明问题,那么请意识到 temp == cur
(第一项任务),所以也 cur.next == temp.next
. 如果你给 cur.next
那么 temp.next
将是那个新的值。
解决办法是执行 temp=temp.next
之前 你改变 next
指针。
cur=temp
temp=temp.next
cur.next=prev
prev=cur
或者,我觉得更清楚一些,但其实是一样的。
cur=temp
temp=cur.next
cur.next=prev
prev=cur
在这里,你可以清楚地看到这样的模式: 你在任务右边的东西,在下一个任务中会变成左边的。这清楚地表明,你首先 阅读 变量或属性的当前值,然后是 撰写 赋予它新的价值。
NB: 你永远不会 阅读 nxt
所以你不需要这个变量。
在Python中,你可以一次进行多次赋值,这样可以节省一个变量(prev
)因为 都 右边的表达式在任何赋值发生之前就被评估。
temp.next, cur, temp = cur, temp, temp.next
试试下面这个。
def reverselist(self):
temp=self.start
cur=None
prev=None
nxt=None
while(temp!=None):
nxt=temp.next
temp.next = prev
prev = temp
temp = nxt
self.start = prev