Leetcode 24. 两两交换链表中的节点

本文详细介绍了使用迭代方法解决两两交换链表节点的问题,通过哑节点简化边界条件,管理节点指针以确保交换正确性。算法时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

题源: 24. 两两交换链表中的节点

方法:迭代

这个解法采用迭代方法,通过更新链表的指针来交换相邻的节点。使用了一个哑节点(dummy node)来简化边界条件,特别是链表头部的处理。

解题步骤

  1. 初始化哑节点:创建一个新的哑节点 dummyHead 并将其 next 指针指向 head,这样可以避免处理头节点的特殊情况。
  2. 迭代交换:遍历链表,检查当前节点的后两个节点是否存在。
    • 如果存在,执行以下步骤:
      1. cur -> next = cur -> next -> next;
        cur 指向第二个节点。
      2. cur -> next -> next = tmp;
        更新第二个节点的 next 指向第一个节点。
      3. cur -> next -> next -> next = tmp1;
        将第一个节点的 next 指向第二个节点的原 next 节点。
    • 更新 cur 指针到下一对待交换的节点的前一个节点。
  3. 返回结果:由于 dummyHead 是哑节点,因此它的 next 指针指向新的头节点。最后,删除哑节点并返回新的头节点。

代码分析

这个函数通过使用哑节点来避免复杂的头节点检查。这是一个常见的技巧,因为它可以减少特殊情况的检查,使代码更加简洁。同时,这个函数还精心管理了节点间的指针关系,确保了节点交换的正确性,并在结束时释放了哑节点以避免内存泄露。

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表中的节点数量。这是因为我们需要遍历链表中的每个节点。
  • 空间复杂度:O(1),我们只使用了常数级别的额外空间。

Code

/**
 * 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 *dummyHead = new ListNode(0);
        dummyHead -> next = head;
        ListNode * cur = dummyHead;
        while(cur -> next != NULL && cur -> next -> next != NULL){
            ListNode *tmp = cur -> next;
            ListNode *tmp1 = cur -> next -> next -> next;
            
            cur -> next = cur -> next -> next;   //1
            cur -> next -> next = tmp;           //2
            cur -> next -> next -> next = tmp1;  //3

            cur = cur -> next -> next;
        }
        ListNode *res = dummyHead -> next;
        delete dummyHead;
        return res;
    }
};

  
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值