1.1 、问题描述:两两交换链表中的节点
力扣题目链接(opens new window)
https://leetcode.cn/problems/swap-nodes-in-pairs/
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
1.2、链表两两交换思路(极简版)
- 先搞个 “虚拟头结点” 挂在链表最前面 —— 这样不用单独处理真正的头结点(它没有前一个指针,不搞虚拟头会很麻烦)。
- 一定要画图!交换时要动好几个指针,不画图标清楚,很容易把链表 “扯断”。
- 让 curr 指针先指向虚拟头结点,然后重复三步(直到 cur 后面没两个节点可换):
- 先记住三个点:curr 后面要换的两个节点(叫 node1、node2),还有 node2 后面的节点(叫 nextNode);
- 让 node2 的 next 指向 node1(先把俩节点反过来连);
- 让 node1 的 next 指向 nextNode、cur 的 next 指向 node2(把交换好的节点和前后链表接顺);
- 把 cur 移到 node1 的位置,继续处理下一组,直到结束。(下面是示意图)
1.3 、指针交换示意图:

2.1、代码实现
public ListNode swapPairs(ListNode head) {
// 递归终止条件:如果链表为空,或者只剩一个节点(没有下一个节点可交换),直接返回当前节点
// 这一步保证了递归不会无限进行,也是最小子问题的解(无需交换)
if (head == null || head.next == null) {
return head;
}
// 记录当前节点的下一个节点(即要和head交换的节点)
// 比如链表是1->2->3->4,这里head是1,next就是2(后续会成为交换后的新头)
ListNode next = head.next;
// 递归处理"当前两个节点之后的子链表",得到交换后的子链表头节点
// 以上面的例子,就是处理3->4,递归后会返回交换后的4(子链表变成4->3)
ListNode newLinked = swapPairs(next.next);
// 交换当前的两个节点:让第二个节点(next)指向第一个节点(head)
// 此时2->1(原本是1->2)
next.next = head;
// 让第一个节点(head)指向后面处理好的子链表
// 此时1->4(连接前面的2->1和后面的4->3)
head.next = newLinked;
// 交换后,原本的第二个节点(next)成为了当前子链表的新头,返回给上一层递归
// 比如第一层递归后返回2,最终链表变成2->1->4->3
return next;
}
个人总结学习用,对部分内容进行了简单的处理和归纳,如有谬误,希望大家指出,
持续修订更新中。
参考文档:
- 程序员 Carl. 代码随想录(LeetCode 数据结构与算法刷题攻略)(EB/OL). https://www.programmercarl.com/,2025-02/2025-10.
- 《数据结构》课程教学大纲(2024 版)(EB/OL). https://m.book118.com/html/2024/0423/8110022111006061.shtm,2024-04/2025-10.
- 《数据结构》课程教学大纲(软件工程专业)(EB/OL). https://m.renrendoc.com/paper/329728026.html,2024-05/2025-10.
- 程序员 Carl. LeetCode-Master(代码随想录刷题攻略 GitHub 仓库)(EB/OL). https://github.com/youngyangyang04/leetcode-master,2025-09/2025-10.

3311

被折叠的 条评论
为什么被折叠?



