一、题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
二、示例
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
三、输入输出说明
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
四、基本思路
由于操作过程中会对第一个元素进行位置改变,所以在原head之前增加一个指针ans,使得ans->next = head,便可以进行后续操作
之后是进行两个元素的位置交换,通常画个图会不易出错,操作的时候记住:务必先记录即将断裂的部分,再进行断链操作
如图,在交换元素a,b的过程中,需要断开a与b的连接,于是先用中间变量指针t记录b:t = p->next->next
接下来断开b与后续元素的连接,于是记录b后续元素的位置:p->next->next = t->next,此步相当于将a与之前b的后续元素相连
由于b->next已经被记录,所以可以给b->next重新赋值:t->next = p->next,此步相当于完成了a与b的位置交换
然后将p与a,b进行连接以形成完整链:p->next = t
每次循环完成后更新p的位置,即向后移动两个元素,p = p->next->next = t->next
五、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *ans = new ListNode(-1);
ans->next = head;
ListNode *p = ans, *t;
while (p->next != nullptr && p->next->next != nullptr) {
t = p->next->next;
p->next->next = t->next;
t->next = p->next;
p->next = t;
p = t->next;
}
return ans->next;
}
};