设置一个虚拟头节点,将由于需要分奇偶讨论,奇数情况下,如果当前指针后面只剩余一个结点则退出循环,偶数情况下,如果当前指针后面没有结点则退出循环。因此循环条件是cur->next和cur->ne->next都不为空,考虑空表的情况,所以cur初始指向虚拟头节点。每次迭代需要修改的指针如下:(图源代码随想录官网)
注意每次修改一个结点的next指针域后,他后面的结点都可能不是原来的结点了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyhead = new ListNode(-1);
dummyhead->next = head;
ListNode* cur = dummyhead;
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode* tmp1 = cur->next;
ListNode* tmp2 = cur->next->next->next;
cur->next = tmp1->next;
cur->next->next = tmp1;
tmp1->next = tmp2;
cur = cur->next->next;
}
ListNode* newhead = dummyhead->next;
delete dummyhead;//删除虚拟头节点
return newhead;
}
};