开篇废话
今天回刷了一道入门的链表逆序题。Python实现的很简单一句就够了。但是写的实在是很随意,pre, cur, cur.next = cur, cur.next, pre
这个赋值其实是有问题的。一直觉得Python的赋值真的很优雅所以压根没考虑什么赋值顺序的问题。所以结果怎么都不对。提示我cur.next == None。后来仔细琢磨下其实很简单。简单总结下赋值规则。
- Python赋值
=
等号优先级最低,所以如果等式右边有表达式的话,会先计算右边的表达式。 - 之后计算完毕,等式右边就当做值而存在,从等式右边的第一个向等式左边的第一个变量开始赋值。并且注意,如果左边的变量,又是等式右边第二个需要赋值的变量,它也是不会变化的。上面说了,右边只有以值而存在的。简单演示如下:
>> a, b, c = 1, 2, 3
>> a, b, c = b, a, b
>> a, b, c
>> 2, 1, 2
回到这道链表逆序上来,其实仔细核对一下发现一下其实是赋值顺序问题导致的。
按照pre, cur, cur.next = cur, cur.next, pre
这个写法,假如链表结点值是[1,2,3,4,5]按照上面这个语句赋值结果pre:List:Node{1, ListNode{2, None}} cur:ListNode{2, None} cur.next:None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, pre = head, None
while cur:
p, cur, cur.next = cur, cur.next, p # 错误代码
cur.next, cur, pre = pre, cur.next, cur # 正确代码
return pre
所以顺序还是很重要的~最后在强调一下Python真他妈的优雅!!!!