本题源自leetcode 24
----------------------------------------------------------------------
思路1: 创建一个头节点。然后从头结点之后开始遍历,每次翻转俩个节点,并保留前驱指针。最后返回头结点的下一个节点。
思路2: 用一个指针的指针来保留第一个节点。每次交换完,把双指针节点更新为下一次要交换的第一个节点。
代码:
ListNode* swapPairs(ListNode* head) {
/*
if(head==NULL||head->next==NULL)
return head;
ListNode* root=new ListNode(0);
root->next=head;
ListNode* pre=root;
ListNode* p=head;
ListNode* pNext=NULL;
while(p&&p->next!=NULL){
pNext=p->next;
p->next=pNext->next;
pNext->next=pre->next;
pre->next=pNext;
pre=p;
p=p->next;
}
return root->next;
*/
if(!head || !head->next)
return head;
ListNode** p=&head;
ListNode*a,*b;
while((a=*p)&&(b=a->next)){
a->next=b->next;
b->next=a;
*p=b;
p=&(a->next);
}
return head;
}