力扣:24两两交换链表的节点
目录
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 = 1
- node2 = temp->next->next = 2
调整指针:
- temp->next = node2:- dummy(0) -> 2
- node1->next = node2->next:- 1 -> 3
- node2->next = node1:- 2 -> 1
此时链表:
dummy(0) -> 2 -> 1 -> 3 -> 4
temp = node1 = 1第二次循环:
- node1 = temp->next = 3
- node2 = temp->next->next = 4
调整指针:
- temp->next = node2:- 1 -> 4
- node1->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/
https://leetcode.cn/problems/swap-nodes-in-pairs/description/
