链表成对交换节点代码疑问:交换步骤如何避免丢失后续链表?
链表成对交换节点的步骤疑惑解答
我正在解决链表成对交换节点(swap node in pairs)问题,已得到正确代码,但对交换步骤存在疑惑。代码如下:
def swapPairs(head): pre = ListNode(0) pre.next = head while pre.next and pre.next.next: a = pre.next b = a.next pre.next, b.next, a.next = b, a, b.next pre = a return pre.next
以链表1->2->3->4为例,初始时a指向1、b指向2,疑惑交换步骤中,b.next先指向a,为何不会丢失2之后的链表?
这核心原因是Python的元组解包是先计算所有右侧表达式的值,再一次性赋值给左侧变量,不是按顺序逐个执行赋值操作。
拿你举的1->2->3->4例子来说,执行pre.next, b.next, a.next = b, a, b.next这行代码时:
- 第一步先把右侧三个值全部计算出来:
b是节点2,a是节点1,b.next此时还是节点3(因为这一步只是读取值,还没修改b.next) - 第二步才把这三个预计算好的值依次赋值给左侧变量:
pre.next赋值为节点2(让哑节点的下一个节点变成交换后的第一个节点)b.next赋值为节点1(让节点2指向节点1)a.next赋值为节点3(让节点1指向原来节点2的后续节点3)
整个过程中,节点2原本的后续节点3在赋值操作开始前就已经被读取并保存了,所以就算之后修改b.next指向a,也不会丢失后续的链表部分。
内容的提问来源于stack exchange,提问作者Taelung
相关产品推荐
相关产品推荐

