思路:
用三个指针进行操作. 现将两个指针指向当前的节点对, 然后将上一个节点对和当前节点对连接好, 然后交换当前节点对的位置, 最后做一些为下一轮指针处于正常位置的的准备工作. 详细看注释.
ListNode* swapPairs(ListNode* head) {
if (! head || ! head->next) return head;
ListNode* cur = head; // 当前节点, 一般指向节点对的后一个节点
ListNode* prev1 = NULL; // 前节点, 一般指向节点对的前一个节点
ListNode* prev2 = NULL; // 前前节点, 一般指向上一对节点对的后一个节点
while (cur && cur->next) {
// 挪到新的一对节点处
prev1 = cur;
cur = cur->next;
// 更新头结点
if (prev1 == head)
head = cur;
// 将上一对的尾节点和当前头结点连在一起
if (prev2)
prev2->next = cur;
ListNode* pNext = cur->next;
// 交换当前这对节点的顺序
cur->next = prev1;
prev1->next = pNext;
// 前前指针指向当前节点对的尾节点, 为下轮循环连接下一个首节点做准备
prev2 = prev1;
// cur挪到下一对的首节点
cur = pNext;
}
return head;
}