每次循环只对三个点进行操作,即需要交换的两点以及需要交换的两点前面的一点(方便进行操作)。
/**
* 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(0);
dummyhead->next = head;
ListNode* cur = dummyhead;
while(cur->next != nullptr && cur->next->next != nullptr)
{
ListNode* tmp1 = cur->next; //记录下需要交换的第一个节点
ListNode* tmp2 = cur->next->next; //记录下需要交换的第二个节点
ListNode* tmp3 = cur->next->next->next;//记录下之后的第三个节点,因为要将交换后节点连接到第三个节点上
cur->next = tmp2;
tmp2->next = tmp1;
tmp1->next = tmp3;
cur = cur->next->next; //将虚拟节点设置到下一组需要交换的第一个节点前作为新的虚拟节点
}
return dummyhead->next;
}
};