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

server/2024/10/20 9:37:26/

题目描述

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

解题思路

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

方法一:迭代法

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

方法二:递归法

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

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

算法实现

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

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++实现)

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

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


http://www.ppmy.cn/server/133305.html

相关文章

沪尚茗居装修秘籍:嵌入式蒸烤箱,让厨房生活更精彩

在装修厨房时,选择一款合适的嵌入式蒸烤箱不仅能提升烹饪效率,还能为厨房增添一份现代感。沪尚茗居深知用户对厨房电器的需求,从实际出发,为用户推荐选购嵌入式蒸烤箱的实用技巧,让厨房生活更加美好。    首先&…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产,企业管理员必须建立高效的企业终端安全管控机制,确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统,确保任何未经授权的资产变动都能被迅…

软件测试工程师:如何写出好的测试用例?

软件测试用例(Test Case)是软件测试过程中的一种详细文档或描述,用于描述在特定条件下,对软件系统或组件进行测试的步骤、输入数据、预期输出和预期行为。编写高质量的测试用例是确保软件质量的关键步骤之一。以下是一些编写优秀测试用例的建议&#xff…

idea 发布jar包

当你有一个能正常编译的项目,以springboot为例,有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构,打开项目结构设置 2.项目结构-->Artifacts,如图所示选择 3.在Create JAR from Modules配置…

【C语言】TCP接收已知长度的数据

在C语言中,通过TCP接收已知长度的数据通常涉及以下几个步骤: 1. 创建套接字(socket)。 2. 绑定套接字到指定的IP和端口。 3. 监听连接请求。 4. 接受连接请求。 5. 接收数据。 下例展示了一个简单的TCP服务器,用于接收已知长度的数据: #include <stdio.h> #includ…

等保测评中的安全培训与意识提升

在等保测评中&#xff0c;安全培训与意识提升是非常重要的环节。通过安全培训&#xff0c;可以提高员工的安全意识和技能&#xff0c;从而减少安全事故的发生。同时&#xff0c;安全培训也可以帮助员工更好地理解和遵守安全规定&#xff0c;提高企业的安全管理水平。 在等保测评…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

计算机组成原理之磁盘存储器

磁盘存储器&#xff1a; 定义&#xff1a;磁盘存储器是以磁盘为存储介质的存储器&#xff0c;利用磁记录技术在涂有磁记录介质的旋转圆盘上进行数据存储。 特点&#xff1a;存储容量大、数据传输率高、存储数据可长期保存。 构成&#xff1a;通常由磁盘、磁盘驱动器&#xf…