两两交换如上图所示,采用虚拟头结点的方法进行正常模拟交换即可。(这样就可以不考虑头结点的问题了)
当虚拟头结点后的两个结点均不为NULL时,则可以进行交换(两个结点才可以交换)。
一开始cur指向虚拟头结点,当后两个结点均不为NULL时,进行交换,如图所示,采用两个temp保存结点辅助交换,当5步交换完成后;cur更新至1结点处,也就是下一次要交换的两个结点中第一个结点的前驱节点。 然后若条件满足,则继续进行交换,直至循环结束,完成交换。
最后返回的头结点为虚拟头结点的指针域所指的结点。
力扣题目24:两两交换链表中的结点
/**
* 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* dummyNode = new ListNode(0);
dummyNode->next = head;//初始化虚拟头结点
ListNode* cur = dummyNode;
while (cur->next && cur->next->next) {
ListNode* temp1 = cur->next;
cur->next = cur->next->next;
ListNode* temp2 = temp1->next->next;
temp1->next->next = temp1;
temp1->next = temp2;
cur = cur->next->next;
}
return dummyNode->next;
}
};