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.nextpre = Nonecur = p0.nextfor _ in range(right - left + 1):nxt = cur.nextcur.next = pre # 每次循环只修改一个 next,方便大家理解pre = curcur = nxt# 见视频p0.next.next = curp0.next = prereturn 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)。