Python链表节点变量引用及LeetCode代码赋值差异疑问
插入排序链表中
last_sorted.next和head.next的区别 本质逻辑差异
先明确插入排序链表的核心思路:我们需要一个last_sorted指针,专门指向已排序部分链表的最后一个节点。初始状态下,整个链表只有头节点是已排序的,所以last_sorted和head指向同一个ListNode对象。
- 使用
curr = last_sorted.next:- 初始阶段和
curr = head.next拿到的是同一个节点,但随着排序推进,last_sorted会向后移动——当待排序节点刚好处于已排序部分的末尾时,我们会把last_sorted更新为这个节点。此时last_sorted.next会自动指向下一个未排序的节点,保证能逐个处理完所有链表元素。
- 初始阶段和
- 使用
curr = head.next:- 仅第一次循环有效,后续
head始终固定指向链表头节点,head.next永远是初始的第二个节点,会导致循环陷入死循环或仅处理同一个节点,完全无法完成链表排序。
- 仅第一次循环有效,后续
Python控制台实验验证初始引用一致性
通过以下控制台代码可验证初始时last_sorted与head指向同一个对象:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 创建测试链表:4 -> 2 -> 1 -> 3 head = ListNode(4) head.next = ListNode(2) head.next.next = ListNode(1) head.next.next.next = ListNode(3) last_sorted = head # 验证引用一致性 print(head is last_sorted) # 输出: True print(head.next is last_sorted.next) # 输出: True # 修改last_sorted的next属性,观察head的变化 last_sorted.next = ListNode(5) print(head.next.val) # 输出: 5,说明二者指向同一对象,修改属性会互相影响
为什么必须用last_sorted.next
插入排序的核心是逐步扩展已排序区间:
- 初始已排序区间:仅包含头节点
head - 每次取已排序区间的下一个节点(
last_sorted.next)作为待插入节点curr - 将
curr插入到已排序区间的正确位置 - 若
curr恰好位于已排序区间末尾(无需移动),则更新last_sorted为curr,完成已排序区间的扩展
如果改用head.next,每次循环只会获取链表的第二个节点,永远无法推进到后续未排序节点,直接导致排序逻辑失效。
内容的提问来源于stack exchange,提问作者Xiangyi Li
相关产品推荐
相关产品推荐

