LeetCode #206反转链表:为何返回prev变量作为解决方案?
为什么反转链表的解法中返回prev就是完整的反转链表?
先看原题的代码实现:
class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: # setting pointers prev, curr = None, head while curr is not None: nxt = curr.next curr.next = prev prev = curr curr = nxt return prev
我们用链表[1,2,3,4,5]一步步拆解循环过程,就能明白为什么最后返回prev是完整的反转链表:
初始状态
prev = None(用来记录当前节点的前一个节点)curr = 1(指向原链表的头节点)
第1轮循环
nxt = curr.next→ 保存当前节点的下一个节点,也就是2curr.next = prev→ 把当前节点1的指针反转,指向prev(也就是None),现在1变成了反转链表的尾节点prev = curr→prev移动到当前节点1,现在它记录的是反转链表的最后一个有效节点curr = nxt→curr移动到下一个节点2,继续处理原链表的剩余部分
此时链表状态:1 → None,2 → 3 → 4 → 5
第2轮循环
nxt = 3→ 保存2的下一个节点curr.next = prev→2的指针反转指向1,现在反转链表变成2 → 1 → Noneprev = 2→prev更新为2,成为反转链表的新头部curr = 3→ 移动到原链表的下一个节点
此时链表状态:2 → 1 → None,3 → 4 → 5
第3轮循环
nxt = 43的指针反转指向2,反转链表变为3 → 2 → 1 → Noneprev = 3,curr = 4
此时链表状态:3 → 2 → 1 → None,4 → 5
第4轮循环
nxt = 54的指针反转指向3,反转链表变为4 → 3 → 2 → 1 → Noneprev = 4,curr = 5
此时链表状态:4 → 3 → 2 → 1 → None,5 → None
第5轮循环
nxt = 5.next→ 也就是None5的指针反转指向4,现在完整的反转链表是5 → 4 → 3 → 2 → 1 → Noneprev = 5→prev移动到5,成为反转链表的头部curr = nxt→curr变成None,循环结束
循环结束时,curr已经走到原链表的末尾(None),而prev刚好停在反转后的链表的头节点5上。因为每一轮循环都把当前节点的指针反转指向了前一个节点,所以从5开始顺着next指针走,就能遍历完整的反转链表,返回prev自然就是最终的解。
内容的提问来源于stack exchange,提问作者Erick Pruneda
相关产品推荐
相关产品推荐

