对单链表操作,任意一对数交换位置,如果最后只剩下一个数,则不需要交换
思路:设置三个指针:pre,p,pnext进行操作,并用pnext2记录下次循环的起点。
程序示意图如下所示:
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr) {
return head;
}
ListNode* pre = nullptr;
ListNode* p = head;
ListNode* pnext = head->next;
ListNode* pnext2 = nullptr;
head = pnext;
while (pnext) {
pnext2 = pnext->next;
if (pre) {
pre->next = pnext;
}
pnext->next = p;
p->next = pnext2;
//一次交换完成,开始下一轮交换的赋值
pre = p;
p = pnext2;
if (p) {
pnext = p->next;
} else {
pnext = nullptr;
}
}
return head;
}