题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
思路
直接模拟。
建议在具体思考操作流程的时候画图。
代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);//设置一个虚拟头节点
dummyHead->next = head;//把虚拟头节点指向head
ListNode* cur = dummyHead;
//开始交换
while (cur->next != nullptr && cur->next->next != nullptr) {
ListNode* tmp = cur->next;//记录临时节点
ListNode* tmp1 = cur->next->next->next;//记录临时节点
cur->next = cur->next->next;//步骤一,虚拟头节点从指向第一个节点变成指向第二个节点
cur->next->next = tmp;//步骤二,第二个节点从指向第三个节点变成指向第一个节点
cur->next->next->next = tmp1;//步骤三,第一个节点从指向第二个节点变成指向第三个节点
cur = cur->next->next;//cur移动两位,准备下一轮交换
}
ListNode* res = dummyHead->next;//创建res用来保存结果
delete dummyHead;//删除虚拟头节点
return res;
}
};
时间复杂度:O(n);
空间复杂度:O(1);