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

本文深入探讨了如何使用Python反转单向链表的算法。通过详细的代码示例,解释了迭代和递归两种方法,并讨论了Python多元赋值的特性及其在链表反转中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值