Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
这里贴一个错误代码,本人的:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(head|| head->next)
return head;
ListNode *p, *q, *swap;
p = head;
q = p->next;
swap = q;
while(p&&q)
{
p->next = q->next;
q->next = p;
p = p->next;
q = p->next;
}
return swap;
}
};
Submission Result: Runtime Error
Last executed input:{1,2}原因:
q = p->next; //此时p=NULL了
于是添加 if(p)于前
又错误:
Submission Result: Runtime Error
Last executed input:{}还是那个原因
if(head||head->next)
head=NULL时, head->next就错了
改之:
if(!head||!head->next) return head;
当一切就绪时,
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(!head||!head->next)
return head;
ListNode *p, *q, *swap;
p = head;
q = p->next;
swap = q;
while(p&&q)
{
p->next = q->next;
q->next = p;
p = p->next;
if(!p)
break;
else
q = p->next;
}
return swap;
}
};
Input:{1,2,3,4}Output:{2,1,3}Expected:{2,1,4,3}
这个错误是, 到后面, 前断开的没连上
增加前面的pre
最终代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(!head||!head->next)
return head;
ListNode *p, *q, *swap, *pre;
p = head;
q = p->next;
swap = q;
pre = NULL;
while(p&&q)
{
p->next = q->next;
q->next = p;
if(pre)
pre->next = q;
pre = p;
p = p->next;
if(!p)
break;
else
q = p->next;
}
return swap;
}
};