news 2026/5/26 8:17:07

【每日算法】24. 两两交换链表中的节点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日算法】24. 两两交换链表中的节点

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

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

1. 题目描述

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

示例1:

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

示例2:

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

示例3:

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

2. 问题分析

这是一个经典的链表操作问题,在前端开发中,类似的操作在处理DOM元素重新排列、数据流管道转换等场景都会遇到。链表节点的交换需要考虑以下几个关键点:

  1. 相邻节点间的指针修改
  2. 交换后与前后节点的连接
  3. 边界条件处理(空链表、单节点链表)
  4. 操作顺序避免链表断裂

3. 解题思路

3.1 迭代法(最优解)

使用虚拟头节点(dummy node)简化边界处理,通过三个指针(pre, node1, node2)完成相邻节点交换。

时间复杂度:O(n)
空间复杂度:O(1)

3.2 递归法

利用递归的栈空间,将问题分解为:交换前两个节点,然后递归处理剩余链表。

时间复杂度:O(n)
空间复杂度:O(n)(递归栈空间)

4. 各思路代码实现

4.1 迭代法实现

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */constswapPairs=function(head){// 创建虚拟头节点,简化边界处理constdummy=newListNode(0,head);letpre=dummy;while(pre.next&&pre.next.next){// 定位要交换的两个节点constnode1=pre.next;constnode2=pre.next.next;// 执行交换操作// 1. 将pre指向node2pre.next=node2;// 2. 将node1指向node2的下一个节点node1.next=node2.next;// 3. 将node2指向node1node2.next=node1;// 移动pre指针,准备下一轮交换pre=node1;}returndummy.next;};

4.2 递归法实现

constswapPairs=function(head){// 递归终止条件:没有节点或只有一个节点if(!head||!head.next){returnhead;}// 要交换的两个节点constnode1=head;constnode2=head.next;// node1指向后续递归结果node1.next=swapPairs(node2.next);// node2指向node1完成交换node2.next=node1;// 返回新的头节点returnnode2;};

5. 各实现思路的复杂度、优缺点对比

方法时间复杂度空间复杂度优点缺点适用场景
迭代法O(n)O(1)空间效率高,适合处理大链表;操作直观需要处理多个指针,边界条件需小心生产环境推荐,内存敏感场景
递归法O(n)O(n)代码简洁,逻辑清晰;符合分治思想递归深度受链表长度限制;栈空间开销大链表长度有限;学习理解递归思想

6. 总结

6.1 算法思想应用

链表节点交换问题体现了以下重要思想:

  1. 虚拟头节点技巧:简化边界处理,避免对头节点的特殊判断
  2. 多指针操作:在链表操作中,合理使用多个指针可以清晰表达操作意图
  3. 递归与分治:将大问题分解为相同的小问题解决

6.2 前端实际应用场景

  1. DOM元素重排:在实现拖拽排序、列表项交换时,类似的指针操作思想可以帮助优化DOM操作
  2. 数据流处理:在处理管道化的数据转换时,链表操作思想有助于设计高效的数据处理链
  3. 状态管理:在复杂状态流转场景中,节点交换思想可用于状态迁移管理
  4. 虚拟DOM Diff:React等框架的diff算法中,包含类似节点位置交换的优化策略
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 6:34:32

SQL语言家族入门指南:标准SQL、T-SQL与PL/SQL详解

SQL语言家族入门指南:标准SQL、T-SQL与PL/SQL详解 对于数据库初学者来说,SQL语言的各种变体常常让人困惑。本文将为你详细解析标准SQL、T-SQL和PL-SQL的概念及其应用场景。 标准SQL 概念 标准SQL (Structured Query Language) 是由ANSI和ISO标准化组织制…

作者头像 李华
网站建设 2026/5/25 8:38:22

Thymeleaf 项目创建及请求响应过程解析

创建项目 1. 使用Spring Initializr创建项目 访问 https://start.spring.io/ 或使用IDE的Spring Initializr功能,选择以下依赖: Spring WebThymeleafSpring Boot DevTools(可选,用于开发时热部署) 项目结构 src/main/j…

作者头像 李华
网站建设 2026/5/24 23:58:19

铝箔与铝制品自动检测:基于YOLO13-C3k2-ConvFormer的智能分类系统详解

1. 铝箔与铝制品自动检测:基于YOLO13-C3k2-ConvFormer的智能分类系统详解 1.1. 系统概述 铝制品在现代工业中应用广泛,从包装材料到电子元件,从建筑材料到航空航天部件,都离不开铝及其合金制品。然而,铝制品在生产过…

作者头像 李华
网站建设 2026/5/25 23:04:41

【稀缺技术公开】:R实现量子模拟飞秒级时间分辨率的秘密路径

第一章:R 量子模拟的测量精度在量子计算与量子模拟的研究中,测量精度是决定实验结果可信度的关键因素。R语言凭借其强大的统计分析能力与可视化工具,被广泛应用于量子模拟数据的后处理与误差分析中。通过精确建模测量噪声、系统漂移和量子态坍…

作者头像 李华
网站建设 2026/5/25 11:48:35

【临床数据R语言亚组分析实战】:掌握高效亚组挖掘技巧与代码实现

第一章:临床数据亚组分析概述 在临床研究中,亚组分析是一种重要的统计方法,用于探索治疗效应在不同患者群体中的异质性。通过对特定人口学特征、疾病严重程度或生物标志物等变量进行分层,研究人员能够识别出对干预措施反应更显著的…

作者头像 李华
网站建设 2026/5/24 16:28:17

为什么90%的AI语音项目都卡在音频质检?Dify 1.7.0给出答案

第一章:为什么90%的AI语音项目都卡在音频质检?在AI语音系统开发中,模型训练只是冰山一角,真正决定项目成败的是隐藏在背后的音频质检环节。大量团队在数据采集后直接进入训练阶段,却忽视了原始音频中存在的噪声、静音段…

作者头像 李华