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.
比较简单的做法是递归自己,时间是4ms。更快的做法是设4个指针换位置,时间为0ms,但是代码要麻烦一些
ListNode* swapPairs(ListNode* head) {
if(!head || !head->next)return head;
ListNode* p1=head;
ListNode* p2=head->next;
p1->next=swapPairs(p2->next);
p2->next=p1;
return p2;
}
ListNode* swapPairs(ListNode* head) {
if(!head||!(head->next))return head;
ListNode* p1=head;
ListNode* p2=p1->next;
ListNode* p3=p2->next;
ListNode* p4=NULL;
if(p3)p4=p3->next;
ListNode* newHead=p2;
while(p1 && p2)
{
if(p3&&p4)
{
p2->next=p1;
p1->next=p4;
p1=p3;
p2=p4;
if(p4)p3=p4->next;
else p3=NULL;
if(p3)p4=p3->next;
else p4=NULL;
}
else{
p2->next=p1;
p1->next=p3;
if(p3)p3->next=NULL;
break;
}
}
return newHead;
}