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

LeetCode24两两交换链表中的节点 算法特点及适用场景特点利用递归的方法实现链表节点的两两交换操作,代码结构简洁明了,逻辑清晰,符合链表这种通过指针依次访问节点的数据结构特点,易于理解和实现。它能够准确地按照要求将链表中相邻的两个节点进行两两交换,保证了链表结构在交换后的正确性。时间复杂度为 ,在处理链表节点两两交换问题上具有较好的效率表现,只要链表的节点数量在可接受范围内,都能快速地完成交换操作。适用场景。 阅读详情

题目

来源:LeetCode.

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [ 0 , 100 ] [0, 100] [0,100] 内
  • 0 < = N o d e . v a l < = 100 0 <= Node.val <= 100 0<=Node.val<=100

接下来看一下解题思路:

思路一:递归:

    递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

    如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。
    链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

    用 h e a d head head 表示原始链表的头节点,新的链表的第二个节点,用 n e w H e a d newHead newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 n e w H e a d . n e x t newHead.next newHead.next。
    令 h e a d . n e x t = s w a p P a i r s ( n e w H e a d . n e x t ) head.next = swapPairs(newHead.next) head.next=swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 h e a d head head 的下一个节点。
    然后令 n e w H e a d . n e x t = h e a d newHead.next = head newHead.next=head,即完成了所有节点的交换。最后返回新的链表的头节点 n e w H e a d newHead newHead。

public static ListNode swapPairs1(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode newHead = head.next;
    head.next = swapPairs(newHead.next);
    newHead.next = head;

    return newHead;
}
总结

    时间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表的节点数量。
    空间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表的节点数量。

思路二:迭代:

    创建哑结点 d u m m y dummy dummy,令 d u m m y . n e x t = h e a d dummy.next = head dummy.next=head。令 p r e d pred pred 表示当前到达的节点,初始时 p r e d = d u m m y pred = dummy pred=dummy。每次需要交换 p r e d pred pred 后面的两个节点。

    如果 p r e d pred pred 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 p r e d pred pred 后面的两个节点 c u r cur cur 和 a f t e r after after,通过更新节点的指针关系实现两两交换节点。

    具体而言,交换之前的节点关系是 p r e d − > c u r − > a f t e r pred -> cur -> after pred−>cur−>after,交换之后的节点关系要变成 p r e d − > a f t e r − > c u r pred -> after-> cur pred−>after−>cur
    完成上述操作之后,节点关系即变成 p r e d − > a f t e r − > c u r pred -> after-> cur pred−>after−>cur。再令 p r e d = c u r pred = cur pred=cur,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

    两两交换链表中的节点之后,新的链表的头节点是 d u m m y . n e x t dummy.next dummy.next,返回新的链表的头节点即可。

public static ListNode swapPairs(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode dummy = new ListNode(-1, head);
    ListNode pred = dummy;

    while (pred.next != null && pred.next.next != null) {
        ListNode cur = pred.next;
        ListNode after = pred.next.next;
        pred.next = after;
        // 交换节点
        cur.next = after.next;
        after.next = cur;
        // 下一次交换的前驱节点
        pred = cur;
    }

    return dummy.next;
}
总结

    时间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表的节点数量。
    空间复杂度: O ( 1 ) O(1) O(1)。

【中等】力扣算法题解析LeetCode24:两两交换链表中的节点 该题目要求两两交换链表中的相邻节点,只能通过修改节点指针实现。使用虚拟头节点简化操作,通过三指针(pre、node1、node2)迭代完成交换:保存node2的后继节点,调整pre、node2、node1的指针关系,最后移动pre到下一组的前驱位置。时间复杂度O(n),空间复杂度O(1)。 阅读详情

相关推荐

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP(Virtual IP,虚拟IP)负载均衡是一种在计算机网络中常用的技术,用于将网络请求流量均匀地分散到多个服务器上,以提高系统的可扩展性、可靠性和性能。

赵玉的专栏 4122

【力扣算法19】之 24. 两两交换链表中的节点 python

在不修改节点内部值的情况下,给定一个链表,要求对其中相邻的节点进行两两交换,并返回交换后的链表头节点。本文通过递归的方法解决了这个问题。首先检查链表是否为空或只有一个节点,如果是,则无需交换,直接返回原链表。然后定义prev和cur两个指针,分别指向要交换的两个节点。将prev的next指针指向cur的next节点,即将第一个节点的后继指针指向第三个节点;将cur的next指针指向prev,完成节点的交换。接着递归处理剩余部分的链表,并将返回的结果赋值给prev.next,连接交换后的节点

全栈若城,专注知识分享 1177

XGBoost详解(原理篇)

XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。

tt丫的博客 7万+

Python算法题集_两两交换链表中的节点

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

长孤秋落的札记 1301

keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解

单片机的调试分为两种,一种是使用软件模拟调试,第二种是硬件调试,两种调试方式各有不同,软件模拟调试有误差,而硬件调试,借用仿真器调试是嵌入式开发中常用方法。

weixin_51624736的博客 3万+

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2020

详解两两交换链表中的节点

链表交换两个节点

abc123mma的博客 2090

一文快速教你如何下载国自然模版

5. 成功进入“相关文件查看”页面后,点击左侧的“项目申请文件“,如果你此次申请的是“面上项目”,选择对应的下拉框,找到对应的模版下载即可。6. 🫑们发现,在当前页面点击“青年科学基金项目”,左侧出现的是“原国家杰出青年科学基金项目”。7. 进入下一页后,点击“青年科学基金项目”,便可以在右侧找到🫑们要找的模版啦。2. 成功登陆后,点击1处的“首页”,在首页界面,再点击2处的“项目批准”。8. 点击上图3处的“文件详情”,就可以找到可以下载的模版啦(如下图)。3. 从“项目批准”进入后,点击“管理”。

薰珞婷紫小亭子的博客 2397

Python中链表节点两两交换

Python中链表节点两两交换

2201_75412958的博客 451

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 266

Open3D——直通滤波(python详细过程版)【2025最新版】

python就一个字:强。博客长期更新,本文最近更新时间为:2025年1月11日。

点云侠的博客 7514

【链表*】交换结点

只要涉及到链表结点的删除或交换,就必须新建虚拟头结点newHead->next=head,让f指针指向newHead作为前置结点指针(删除和交换都需要前置结点指针的),newHead当然不动,程序最后返回的是newHead->next。 两个两个地交换结点 两个两个地就地交换结点。 大致思路: 一定要先新建一个虚拟结点newHead,newHead->nex...

It's the Climb 6304

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3325

递归-24.两两交换链表中的节点-力扣(LeetCode)

我们的重复子问题就是将链表两两交换,需要一个ListNode*的参数,由于需要返回新的头指针,所以返回值类型是ListNode*。所以题目提供的函数可以拿过来用。

black_bear_white的博客 1038

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode24-两两交换链表中的节点

LeetCode24-两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1-&gt;2-&gt;3-&gt;4, 你应该返回 2-&gt;1-&gt;4-&gt;3. 一、分析 创建一个额外的节点来保存下一个节点所指向的节点,这样就不会丢失节点 易错点1:直接使用头结点 return ...

lyd1995的博客 403

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

24. 两两交换链表中的节点(力扣LeetCode)

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]输入:head = []输出:[]输入:head = [1]输出:[1]

m0_73841621的博客 730

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

LeetCode 24 两两交换链表中的节点 题目链接 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:head = [1] 输出:[1] 用两个链表结点每次取两个指针调换位置即可,AC代码如下: 在这里插入代码片 ...

旺崽的博客 2577

24. 两两交换链表中的节点 - 力扣(LeetCode)

​ 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。​ 递归是一种将问题分解为更小子问题的方法。递归地进行同样的操作。最终,整个链表会通过递归调用被逐步交换完成。递归需要一个明确的终止条件,以避免无限递归。

q1111111da的博客 3980

leetcode24-----两两交换链表中的节点

24. 两两交换链表中的节点 - 力扣(LeetCode)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例 1:[2,1,4,3]示例 2:head = [][]示例 3:head = [1][1]链表中节点的数目在范围[0, 100]内。

xinxin的博客 2575

LeetCode第 24 题:两两交换链表中的节点(C++)

24. 两两交换链表中的节点 - 力扣(LeetCode) 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 这题还是有点麻烦的,需要画图好好分析, 迭代 24. 两两交换链表中的节点_慢慢冲鸭子的博客,这位同学的图画的很好。 class Solution { public: ListNode* swapPairs(ListNode* head) { if(!head || !head->next) return head; ListNode

zj 304

【LeetCode 24】两两交换链表中的节点

【LeetCode 24】两两交换链表中的节点 文章目录【LeetCode 24】两两交换链表中的节点题目描述思路代码总结 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 例如: 给定 1->2->3->4, 你应该返回 2->1->4->3. 思路 才看到题,想到的是一种传统...

weixin_44522586的博客 187

#力扣 LeetCode24. 两两交换链表中的节点 @FDDLC

题目描述: 24. 两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com) 自测用例: [1,2,3,4] [] [1] [1,2] [1,2,3] [1,2,3,4,5] [1,2,3,4,5,6] Java代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * List..

LiuXingchang的博客 310

【LeetCode】24. 两两交换链表中的节点

本文介绍了链表两两节点交换的三种解法:迭代法、递归法和优化迭代法。迭代法通过维护三个指针(prev、first、second)逐步交换相邻节点;递归法采用自底向上策略处理子问题;优化迭代法利用多重赋值简化代码。三种方法的时间复杂度均为O(n),空间复杂度分别为O(1)、O(n)和O(1)。关键点在于正确处理节点引用关系,确保链表不断裂,并注意边界条件如空链表或单节点情况。

qq_32019341的博客 1123

24.力扣LeetCode_两两交换链表中的节点

本文介绍了两种交换链表中相邻节点的方法:三指针法和递归法。三指针法通过虚拟头节点统一处理边界条件,使用三个指针定位和交换节点对,逐步推进完成整个链表的交换。递归法则将问题分解为子问题:先处理后续节点对,再交换当前节点对,最后拼接结果。两种方法的时间复杂度均为O(n),但递归法空间复杂度为O(n)(递归栈),而三指针法为O(1)。三指针法适合大规模数据,递归法代码更简洁但要注意栈溢出风险。两种实现都正确处理了奇数长度链表的边界情况。

2401_82472941的博客 1171

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

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

liuxudanhahaha的博客 1289

力扣 24. 两两交换链表中的节点

本文仅仅简单讲解了《24. 两两交换链表中的节点》这一题目,对迭代法有了一定的了解

m0_51787573的博客 1365
上一篇: LeetCode-23-合并K个升序链表
下一篇: LeetCode-25-K 个一组翻转链表
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值