24、两两交换链表中的节点
1、题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
2、图解思路(图解)
做了四种情况下的分析如下:
根据以上四种情况发现从第三种第四种情况中的第三第四步就回到了第一二种的情况,说明间隔两个为一次重复和循环。
3、代码实现
/**
* 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) {
if(head == NULL || head->next == NULL){
return head;
}
ListNode* cur = head;
ListNode* next = head->next;
ListNode* third = next->next;
while(third && third->next){
cur->next = third->next;
next->next = cur;
if(cur == head){
head = next;
}
cur = third;
next = third->next;
third = next->next;
}
if(cur == head){
head = next;
}
next->next = cur;
cur->next = third;
return head;
}
};