1.題目
給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2.code
/**
* 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) {
if(head==NULL)
return NULL;
if(head->next==NULL)
return head;
ListNode *pre,*p,*pcur,*phead;
phead=new ListNode(-1);
phead->next=head;
pre=phead;
p=pre->next;
pcur=p->next;
cout<<pre->val<<endl;
while(p!=NULL)
{
//交換
p->next=pcur->next;
pcur->next=pre->next;
pre->next=pcur;
//移動
if(p->next==NULL||p->next->next==NULL)
{
pre=p;
p=NULL;
pcur=NULL;
}
else
{
pre=p;
p=pre->next;
pcur=p->next;
}
}
phead=phead->next;
return phead;
}
};
3.分析
1.邊界判斷:鏈表爲空/鏈表只有一個元素
2.增設頭節點:因爲需要記錄三個狀態的值:pre,p,pcur,所以爲了統一,需要申請一個頭節點,最後返回的是這個頭節點的next所表示的鏈表,而不是head,返回head的話會丟失一個元素,因爲head就是原來第一個元素,交換之後,他就變成了第二個元素,所以head代表的是從第二個元素一直到最後結尾。
3.指針爲空的考慮:因爲我們圍繞p進行,當p->next爲空或者p->next->next爲空時,那麼NULL是沒有next操作的,那麼p,pcur的語句就會發生錯誤,所以需要額外考慮。因爲pre=p,所以p爲空不需要考慮。