(一)迭代法
在處理這種問題時,我們通常加上一個dummy頭結點指向head,至於思路很清晰了就是隔一個去交換兩個相鄰結點,比如1->2->3->4->NULL,我們先通過指針交換1和2,再交換3和4,詳細的指針操作可以看下面的圖:

class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *prev=dummy,*cur=head;
while(cur&&cur->next)
{
prev->next=cur->next;
cur->next=cur->next->next; //先確定後繼
prev->next->next=cur;
prev=cur;
cur=cur->next;
}
return dummy->next;
}
};
(二)遞歸版本
遞歸一向是以精巧著稱,我們只需處理好最基礎的一部分,剩下的遞歸即可。如果讀者不是很理解的話,可以手動模擬一下。
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if (head == NULL)
return NULL;
if (head -> next == NULL)
return head;
ListNode *tmp = head -> next;
head -> next = swapPairs(tmp -> next);
tmp -> next = head; // 指向下一部分
return tmp;
}
};