AI智能
改变未来

100天精刷LeetCode-Day4:Reverse Linked List问题(附详细思路和python题解)


206 reverse linked list

题目

Reverse a singly linked list.
Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

代码

class Solution:def reverseList(self, head: ListNode) -> ListNode:if not head or not head.next:return headprev = Nonecur = headwhile cur:cur.next, prev, cur = prev, cur, cur.next# 为什么这三种赋值方式只有第一种正确?#cur.next = prev#prev = cur#cur = cur.next# 为什么这样不行呢?# prev, cur, cur.next = cur, cur.next, prevreturn prev

思考

python 多元赋值是python 的一个特性,原理是tuple的元组封装 (tuple packing) 和 序列拆封(sequence unpacking)
元组封装 (tuple packing) 的逆操作就是序列拆封(sequence unpacking)。这个调用等号右边可以是任何线性序列,序列拆封要求左侧的变量数目与序列的元素个数相同。多元赋值变量交换的例子:

a, b = b, a

就是将(b, a)打包成元祖,再序列的分给(a, b)这个序列

而‘变量’这个定义在python中没有什么意义,更适合的应该叫‘名字’,或者‘标签’,它只是它所指向的对象的一个引用。在这个例子里面,cur和prev是变量,在多元赋值中把标签撕下来指向了别的对象,而cur.next是改变cur所指向对象的值(改变了.next),所以需要考虑顺序问题。

顺序问题需要再做实验去验证。

更新
新的想法,cur.next在左边的意思是:cur所引用的对象的.next属性,是对cur指向的对象的值的改变,而在右侧,cur.next是一个对象,是目前cur所引用对象的.next对象。
试验后,只要cur.next在cur的左边就不会报错了。应该就是这个意思。

recursive 实现

class Solution:def reverseList(self, head: ListNode) -> ListNode:if not head or not head.next: return headans = self.reverseList(head.next)head.next.next = headhead.next = Nonereturn ans
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 100天精刷LeetCode-Day4:Reverse Linked List问题(附详细思路和python题解)