部分来源于https://www.cnblogs.com/healthylife/p/5866391.html
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
#include<cstdlib>
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode *temp = head, *pre = NULL, *next = NULL, *nextGroup = NULL, *newHead;
if(head->next->next == NULL)
{
next = head->next;
next->next = head;
return next;
}
bool flag = true;
newHead = head->next;
while(temp != NULL)
{
next = temp->next;
if(next == NULL)
{
pre->next = temp;
flag = false;
break;
}
if(pre != NULL)
{
pre->next = next;
}
nextGroup = next->next;
next->next = temp;
pre = temp;
temp = nextGroup;
}
if(flag == true)
{
pre->next = NULL;
}
return newHead;
}
};
显示超时,最后执行的输入,[1,2] 以后检查修正
别人用迭代写的代码
#include<cstdlib>
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(!head || !head->next) return head;
ListNode *p = head, *q = head->next, *k = head;
while(q) {
p->next = q->next;
if(p != head) k->next = q;
if(p == head) head = q;
k = p;
p = p->next;
if(p) q = p->next;
else q = NULL;
}
return head;
}
};
考虑组与组之间的联系时,是先把这组与下一组相连(不妄图一步连正确,走到下一组时再修正),而不是走到下一组时再考虑上一组与该组的连接问题。同样,也考虑了奇数个节点的问题。
也有人用递归的方法而不是迭代,几步就写出来了
#include<cstdlib>
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(!head) return NULL;
if(!head->next) return head;
ListNode* temp=head->next;
head->next=swapPairs(temp->next);
temp->next=head;
return temp;
}
};
有人直接修改节点val的值,也通过了测试,但其实是不满足要求的。
#include<cstdlib>
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==NULL) return head;
ListNode* p = head;
while(p != NULL && p->next != NULL){
int tmp = p->val;
p->val = p->next->val;
p->next->val = tmp;
p = p->next->next;
}
return head;
}
};