24. 两两交换链表中的节点
- 题号:力扣24
- 知识点:链表
- 目标完成度:54/150
- 总结
题干:
思路:
- 1.模拟题,主要是想明白这个过程
- 2.建一个虚拟头结点
dummyNode
,以减少对头结点的单独处理 - 3.先让当前结点的后继结点指向其后继结点的后继结点
- 4.然后让当前结点的后继结点的后继结点指向 原当前结点的后继结点(此处需要建一个临时结点
tmp
) - 5.然后让当前结点的后继结点的后继结点的后继结点指向 原当前结点的后继结点的后继结点的后继结点(此处需要建一个临时结点
tmp2
) - 6.最后让当前结点后移两位,也就是让当前结点指向其后继结点的后继结点。继续处理下一对结点
- 7.下图摘自代码随想录:
在这里插入图片描述
// C++
/**
* 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 != nullptr && cur->next->next != nullptr){
ListNode *tmp = cur->next;
ListNode *tmp2 = tmp->next->next;
cur->next = tmp->next;
cur->next->next = tmp;
cur->next->next->next = tmp2;
cur = cur->next->next;
}
return _dummyNode->next;
}
};