看清「两两交换链表中的节点」的状态,答案便不必追赶,它会自己出现。
—— 耶夫托维斯基
Hello,大家好,今天继续刷 LeetCode 热题 100。
这篇要解决的是 24. 两两交换链表中的节点。
前言
「两两交换链表中的节点」的核心不在代码量,而在于找到正确的数据结构、状态定义或遍历顺序。下面按题目、思路、代码和复杂度把它一步步拆开。
1、题目描述
给定链表,每两个相邻节点交换一次,不能直接改节点值。
2、解题思路
链表题先放一个哨兵节点,能把头节点也当作普通节点处理。pre 指向当前这组前面的节点,若后面不足两个就结束;设两个节点为 a、b,依次把 pre.next 接到 b、a.next 接到下一组、b.next 接回 a。交换完成后 pre 前进到 a,继续处理。
3、代码实现
var swapPairs = function(head) {
const dummy = new ListNode(0, head);
let pre = dummy;
while (pre.next && pre.next.next) {
const a = pre.next, b = a.next;
pre.next = b;
a.next = b.next;
b.next = a;
pre = a;
}
return dummy.next;
};
4、复杂度分析
时间 O(n),除哨兵外空间 O(1)。
5、思路总结
- 核心方法:链表题先放一个哨兵节点,能把头节点也当作普通节点处理
- 关键点:
pre指向当前这组前面的节点,若后面不足两个就结束 - 实现提醒:设两个节点为
a、b,依次把pre.next接到b、a.next接到下一组、b.next接回a
结语
以上就是「两两交换链表中的节点」的解法。先把关键状态和不变量想清楚,再落到代码,复杂问题也会清晰很多。