LeetCode 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
**题目描述:**给你一个链表,两两交换其中相邻的节点,返回交换后链表的头节点
视频讲解
文章讲解
思路:
- 欲交换相邻节点1和2,就要知道1之前的节点(为统一操作,使用虚拟头节点)
- 将链表划分为:已交换部分、未交换部分考虑
- 起始:已交换部分为dummyHead
- 终止:未交换部分为 nullptr 或 只剩一个节点
- 每次交换操作前,cur定位到未交换部分首位,tmp定位到cur的后继
- 交换cur和tmp,具体步骤:
/**
* 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) {
// 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* dummyHead = new ListNode(0,head);
ListNode* cur = dummyHead;
ListNode* pre = cur->next;
while(pre && pre->next){
ListNode* temp = pre->next->next;
//交换
cur->next = pre->next;
pre->next->next = pre;
pre->next= temp;
//移动
//cur = pre;
cur = cur->next->next; // cur移动两位,准备下一轮交换
pre = pre->next;
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};