目录
1.题目描述:
2.算法思路:
3.代码展示:
1.题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:

输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
2.算法思路:
给定的代码是一个C++函数,名为swapPairs,接受一个ListNode*类型的头节点指针head,返回交换后的链表头节点。代码的主要步骤如下:
- 创建一个虚拟头节点
dummy,其next指向head。 - 初始化一个指针
temp指向dummy。 - 使用
while循环,条件是temp->next和temp->next->next都不为空。 - 在循环内部:
- 定义
node1为temp->next。 - 定义
node2为temp->next->next。 - 调整指针:
temp->next指向node2。node1->next指向node2->next。node2->next指向node1。
- 移动
temp到node1。
- 定义
- 返回
dummy->next,即交换后的链表头节点。
逐步解析
让我们通过一个具体的例子来逐步解析代码的执行过程。假设输入链表为:1 -> 2 -> 3 -> 4。
初始状态:
dummy(0) -> 1 -> 2 -> 3 -> 4
temp = dummy
第一次循环:
node1 = temp->next = 1node2 = temp->next->next = 2
调整指针:
temp->next = node2:dummy(0) -> 2node1->next = node2->next:1 -> 3node2->next = node1:2 -> 1
此时链表:
dummy(0) -> 2 -> 1 -> 3 -> 4
temp = node1 = 1
第二次循环:
node1 = temp->next = 3node2 = temp->next->next = 4
调整指针:
temp->next = node2:1 -> 4node1->next = node2->next:3 -> nullptr(因为node2->next是4的下一个,为空)node2->next = node1:4 -> 3
此时链表:
dummy(0) -> 2 -> 1 -> 4 -> 3
temp = node1 = 3
第三次循环:
检查temp->next和temp->next->next:
temp->next是3->next,即nullptr。- 不满足循环条件,退出循环。
返回结果:
dummy->next指向2,即交换后的链表头节点。
最终链表:2 -> 1 -> 4 -> 3
3.代码展示:
ListNode* swapPairs(ListNode* head) {//创建一个头节点,便于后续的操作ListNode* dummy = new ListNode(0);ListNode* temp = dummy;//temp的下一个节点和temp的下一个的下一个节点,同时存在才可以进行交换操作while (temp->next && temp->next->next){ListNode* node1 = temp->next;ListNode* node2 = temp->next->next;temp->next = node2;node1->next = node2->next;node2->next = node1;temp = node1;}return dummy->next;
}
24. 两两交换链表中的节点 - 力扣(LeetCode)
https://leetcode.cn/problems/swap-nodes-in-pairs/description/