题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例
- 示例 1:
- 示例 2:
输入:head = []
输出:[]
- 示例 3:
输入:head = [1]
输出:[1]
提示
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
解题思路
- 先将给定的链表按元素交替顺序分为两个链表;
- 再将两个链表中的节点一上一下交叉连起来就得到了题目所要求的新链表。
代码
/**
* 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){ // 节点个数为 0 或 1 直接返回原链表
return head;
}
ListNode *first = NULL, *second = NULL;
int flag = 0;
second = head;
if(head != NULL){
first = head->next;
}
// 将一个链表按节点交替分为两个链表 first 和 second
ListNode *me = NULL;
ListNode *cur_f = first;
ListNode *cur_s = second;
if(head->next != NULL){ // 判断原链表是否只有 1 个节点
me = head->next->next;
}
while(me){
if(flag == 1){
flag = 0;
cur_f->next = me;
cur_f = cur_f->next;
}else{
flag = 1;
cur_s->next = me;
cur_s = cur_s->next;
}
me = me->next;
}
cur_f->next = NULL;
cur_s->next = NULL;
// while(first){
// printf("%d - ", first->val);
// first = first->next;
// }
// printf("\n");
// while(second){
// printf("%d - ", second->val);
// second = second->next;
// }
// printf("\n");
// 将两个链表连成一个链表,并返回新的链表
ListNode *ret = first;
ListNode *ret_ = ret;
cur_f = first->next;
cur_s = second;
while(cur_f && cur_s){
ret->next = cur_s;
cur_s = cur_s->next;
ret = ret->next;
ret->next = cur_f;
cur_f = cur_f->next;
ret = ret->next;
}
while(cur_s != NULL){
ret->next = cur_s;
ret = ret->next;
cur_s = cur_s->next;
}
ret->next = NULL;
return ret_;
}
};
提交结果
总结
- 暴力模拟。