LeetCode 分类刷题:92. 反转链表 II

该文章已生成可运行项目,

题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

解析

灵神讲解:

【基础算法精讲 06】

注意第一句!!!p0 = dummy = ListNode(next=head)

p0 = dummy = ListNode(next=head)这一行很容易让人混淆,因为一旦写成p0 = ListNode(next=head),dummy = ListNode(next=head)就会报错。和列表元素不同,因为p0和dummy都是类的实例,p0指向p0.next之后,dummy的内存地址仍然和原来的p0一样保持不变。

作者:桑榆

链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/1992226/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-teqq/comments/2270952/

来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

----------------------------------------------------------------------------------------------------------

在 Python 中,赋值语句p0 = dummy = ListNode(next=head)和 p0 = ListNode(next=head); dummy = ListNode(next=head) 之间存在很大的不同,尤其是在处理类的实例时。这种区别源于赋值语句的工作方式和对象引用的概念。

赋值和对象引用

单一赋值语句(链式赋值):
p0 = dummy = ListNode(next=head)
在这条语句中,首先创建一个新的 ListNode 对象 ListNode(next=head),然后将 p0 和 dummy 都指向这个新创建的对象。这意味着 p0 和 dummy 引用的是同一个 ListNode 实例

如果你通过 p0 访问或修改该对象的属性,这些更改在 dummy 中也是可见的,反之亦然。

独立赋值语句:
p0 = ListNode(next=head) dummy = ListNode(next=head)
在这种情况下,两次创建了不同的 ListNode 对象。因此,p0 和 dummy 指向的是两个独立的对象,它们的内存地址不同。修改 p0 所指向对象的属性不会影响 dummy 所指向的对象,反之亦然。

作者:寒冬夜行人

链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/1992226/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-teqq/comments/2332001/

来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答案

class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        p0 = dummy = ListNode(next=head)
        for _ in range(left - 1):
            p0 = p0.next

        pre = None
        cur = p0.next
        for _ in range(right - left + 1):
            nxt = cur.next
            cur.next = pre  # 每次循环只修改一个 next,方便大家理解
            pre = cur
            cur = nxt

        # 见视频
        p0.next.next = cur
        p0.next = pre
        return dummy.next

# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/1992226/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-teqq/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度分析

时间复杂度:O(right)。

空间复杂度:O(1)。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值