LeetCode 24 - 两两交换链表中的节点

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

解题思路

交换链表中相邻节点的问题可以通过迭代或递归来解决。本文将介绍两种方法:

方法一:迭代法

  1. 使用一个虚拟头节点dummy,指向链表的实际头节点head,这样可以简化头节点的处理。
  2. 使用指针prev指向需要交换节点的前一个节点,初始化为dummy
  3. cur指向当前要交换的两个节点中的第一个节点,第二个节点由cur->next指向。
  4. 交换curcur->next中的两个节点,然后将指针前移,继续交换下一个一对节点直至链表末尾。

方法二:递归法

  1. 如果链表为空或者只有一个节点,直接返回头节点。
  2. 递归交换后续节点,并将当前节点与后续节点交换。

接下来是两种方法的具体实现。

算法实现

方法一:迭代法实现(C++实现)

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* temp = dummyHead;
        while (temp->next != nullptr && temp->next->next != nullptr) {
            ListNode* node1 = temp->next;
            ListNode* node2 = temp->next->next;
            temp->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            temp = node1;
        }
        ListNode* ans = dummyHead->next;
        delete dummyHead;
        return ans;
    }
};

方法二:递归法实现(C++实现)

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* newHead = head->next;
        head->next = swapPairs(newHead->next);
        newHead->next = head;
        return newHead;
    }
};

复杂度分析

  • 方法一:迭代法

    • 时间复杂度:O(n),其中n是链表的长度。每两个节点进行一次交换,总体需要遍历整个链表。
    • 空间复杂度:O(1),只使用了有限的额外空间。
  • 方法二:递归法

    • 时间复杂度:O(n),每两个节点进行一次交换,总体需要遍历整个链表。
    • 空间复杂度:O(n),因为使用了递归调用,递归调用栈的深度取决于链表的长度。

总结

通过本文,我们介绍了两种解决LeetCode24题目中两两交换链表节点的方法:迭代法和递归法。两种方法都能有效地解决问题,但其不同点在于实现的风格和空间复杂度。迭代方法使用常数空间,适用于不希望使用递归的场景。而递归方法实现较为简洁,但占用较多栈空间。在实际应用中,可以根据具体需求选择合适的方法来解决这个问题。

希望这篇博客能对你有所帮助。如果有任何问题,欢迎随时讨论。

相关推荐
wabs6661 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964131 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
basketball6161 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
嗝o゚2 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本2 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Fre丸子_3 小时前
自定义文件夹选取功能
c++
Ulyanov3 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫3 小时前
特征工程处理
人工智能·算法·机器学习
z落落4 小时前
C#参数区别
java·算法·c#
思麟呀4 小时前
C++工业级日志项目(六)异步日志器
linux·c++·windows