链接: 24. 两两交换链表中的节点
思路
设置虚拟节点时,一定要理解虚拟节点不是头结点,是指向头结点的一个具有链表数据的节点。
中间数据交换后cur已经改变了,脑子中结构也要跟着变。
虚拟指针dummy 的next指向的节点会随着cur的指向改变而改变
最终返回数据时,返回的是虚拟节点指向的头结点
代码
第一种方法
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
struct ListNode* dummy = new ListNode(0); // 虚拟节点
dummy->next = head; // 虚拟节点指向头节点
struct ListNode* cur = dummy;
// 1. 翻转前两个
while(cur->next != nullptr && cur->next->next != nullptr)
{
struct ListNode* tmp = cur->next;
struct ListNode* tmp1 = cur->next->next->next; // 下一次跳跃的节点
// 翻转前两个
cur->next = cur->next->next;
cur->next->next = tmp;
cur->next->next->next = tmp1;
// 前移两位, 准备下一轮交换
cur = cur->next->next;
}
//
struct ListNode* result = dummy->next;
return result;
}
};
结果
时间复杂度: O(n)
空间复杂度: O(1)