思路:链表操作,具体思路见代码注释。
code:
class Solution {
public:
ListNode *swapPairs(ListNode *head) {
if(head == NULL || head->next == NULL)\\只有一个或者两个节点的情况
return head;
ListNode *fast,*slow = head,*t,*last;\\fast,slow为每一组(包含2个节点)的远离、靠近初始首节点的节点指针
int k = 0;
while(slow != NULL){
fast = slow->next;
if(fast == NULL)\\有可能出现奇数个节点的情况
break;
if(k == 0)\\将首节点置于第二个节点
head = fast;
else\\注意前一组节点的第一个节点(未反转前的位置)要链接到后一组的第二个节点(未反转前的位置)
last->next = fast;
k++;
t = fast->next;
fast->next = slow;\\反转链表
slow->next = t;
last = slow;
slow = t;
}
return head;
}
};