您的位置:首页 > 编程语言 > Python开发

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

2020-08-28 16:14 393 查看

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 head
prev = None
cur = head
while cur:
cur.next, prev, cur = prev, cur, cur.next
# 为什么这三种赋值方式只有第一种正确?
#cur.next = prev
#prev = cur
#cur = cur.next
# 为什么这样不行呢?
# prev, cur, cur.next = cur, cur.next, prev
return 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 head
ans = self.reverseList(head.next)
head.next.next = head
head.next = None
return ans
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: