目录
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/