LeetCode经典题解:206、两数之和(Two Sum)
3步口诀+1个场景,面试再也不怕忘反转链表算法
反转链表是算法面试的高频题,很多人觉得指针操作绕来绕去,总是记不住代码。其实根本不用死记,记住一个生活化场景和3步口诀,就能在面试时轻松写出正确逻辑。今天就用最通俗的方式,带你搞定反转链表的迭代法。
一、问题简化:什么是反转链表?
链表就像一串“手拉手”的节点,每个节点的next
指针指向后一个节点,比如 1→2→3→4→5
。反转链表就是把指针方向反过来,变成 5→4→3→2→1
。
二、核心方法:迭代法(面试首选)
迭代法的精髓是用两个指针“一步步反转”,配合一个临时变量防止链表“断链”。记住下面的场景和口诀,代码会自动“冒”出来。
场景联想:“手拉手转身”
把链表想象成一排人 手拉手站成一队(箭头方向就是拉手方向),现在要让他们 反向拉手。我们用两个指针pre
(前面的人)和cur
(当前的人)来指挥,步骤如下:
初始状态:
- 队伍顺序:
1→2→3→4→5
(1拉2的手,2拉3的手,以此类推)。 pre
一开始站在队伍外(pre = null
),cur
从第一个人1开始(cur = head
)。
3步口诀:“存下一个,指向前一个,双指针前移”
每个人依次转身,重复这3步,直到所有人都转完:
-
第一步:存下一个
当前人转身前,先记住身后拉着的人(比如2转身时,先记住身后的3),防止松手后找不到下一个人。
对应代码:ListNode temp = cur.next;
-
第二步:指向前一个
当前人转身,把手拉向pre
(前面的人)。比如2本来拉3,现在改拉1。
对应代码:cur.next = pre;
-
第三步:双指针前移
pre
往前走一步(到当前人位置),cur
也往前走一步(到之前记住的“下一个人”位置),继续下一个人转身。
对应代码:pre = cur; cur = temp;
三、代码实现(附步骤拆解)
把上面的逻辑写成代码,结构清晰到像填空:
public ListNode reverseList(ListNode head) {// 初始状态:pre在队伍外,cur从第一个人开始ListNode pre = null;ListNode cur = head;// 只要还有人没转身,就继续while (cur != null) {// 1. 存下一个要转身的人ListNode temp = cur.next;// 2. 当前人转身,拉前面的人cur.next = pre;// 3. 双指针前移,准备下一个人转身pre = cur;cur = temp;}// 最后pre就是新的排头(5)return pre;
}// 链表节点定义(面试时记得写)
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}
四、面试时怎么快速回忆?
不用记完整代码,记住这4个关键点,就能“推导”出逻辑:
- 初始状态:
pre = null; cur = head;
- 循环条件:
while (cur != null)
(没转完就继续) - 循环内3步:
- 存下一个:
temp = cur.next
- 指向前一个:
cur.next = pre
- 双指针前移:
pre = cur; cur = temp
- 存下一个:
- 返回结果:
return pre
(反转后的头节点)
五、为什么迭代法是面试首选?
- 时间复杂度:O(n),每个节点只遍历一次,效率高。
- 空间复杂度:O(1),只用到3个指针,不占额外空间。
- 逻辑直观:用“手拉手转身”场景就能解释,面试官一听就懂。
总结
反转链表的迭代法其实就是“重复3步操作”:存下一个、指向前一个、双指针前移。记住“手拉手转身”的场景,口诀一背,代码就像填空一样写出来了。面试前用1→2→3→4→5
手动模拟一遍,肌肉记忆就有了,再也不怕紧张忘思路~
觉得有用的话,点赞收藏,下次面试前翻出来快速过一遍,稳了!