news 2026/1/17 8:41:18

链表专题(三):双人舞的艺术——「两两交换链表中的节点」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表专题(三):双人舞的艺术——「两两交换链表中的节点」

场景想象:链表里的节点在排队:1 -> 2 -> 3 -> 4。 现在要求:每两个节点为一组,互换位置

  • 12交换,变成2 -> 1

  • 34交换,变成4 -> 3

  • 最后连起来:2 -> 1 -> 4 -> 3

核心痛点:很多同学会直接把节点的值互换(val互换),虽然能过 LeetCode,但这不是面试官想要的。面试官考的是修改指针指向。 要交换12,你需要操作三个步骤,而且必须小心翼翼,一旦断链就全完了。

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

https://leetcode.cn/problems/swap-nodes-in-pairs/

题目分析:

  • 输入:链表头节点head

  • 目标:两两交换相邻节点。

  • 输出:交换后的链表头节点。

核心思维:虚拟头结点 + 三步走

既然头结点1也要被换到后面去,那头结点肯定会变。口诀:头结点会变,虚拟头结点 (Dummy Head)必不可少!

我们需要一个指针temp指向要交换的两个节点前面的那个位置(初始指向 dummy)。 假设当前是temp -> 1 -> 2 -> 3。我们要交换12。 设node1 = 1,node2 = 2

交换三部曲(画图奇效):

  1. temp.next = node2(步骤一:前面的线连到 2)

    • 状态:temp -> 2,1 -> 2 -> 3

  2. node2.next = node1(步骤二:2 回头连 1)

    • 状态:temp -> 2 -> 1,1 -> 2(这里形成了个小环),1 -> 3(别忘了1还指着3)

  3. node1.next = node3(步骤三:1 连向后面的 3)

    • 状态:temp -> 2 -> 1 -> 3完美!

最后,temp前进到node1的位置(也就是交换后的第二个节点),准备处理下一组34

代码实现 (JavaScript)

JavaScript

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @return {ListNode} */ var swapPairs = function(head) { // 1. 虚拟头结点:凡是头结点会动的题,无脑上 dummy let dummy = new ListNode(0, head); // temp 是当前操作组的“前驱节点” let temp = dummy; // 循环条件:必须要后面至少有两个节点,才能交换 // temp.next 是第一个,temp.next.next 是第二个 while (temp.next !== null && temp.next.next !== null) { // 2. 定义两个要交换的节点 let node1 = temp.next; // 第一个节点 (1) let node2 = temp.next.next; // 第二个节点 (2) // 3. 开启交换三部曲 // 步骤一:前驱指后一个 (dummy -> 2) temp.next = node2; // 步骤二:后一个指前一个 (2 -> 1) node2.next = node1; // 步骤三:前一个指下下个 (1 -> 3) // 注意:这里用 node1.next 指向 node2 原来的 next // 但此时 node2.next 已经被改了,所以要拿 temp.next.next 吗? // 不对,应该在交换前把 node3 保存下来,或者利用 node1.next 还没改的时候 // 其实最简单的是:node1.next = node2.next (这里 node2.next 已经被改成 node1 了,会死循环) // --- 修正逻辑 --- // 我们需要先保存 node3 (下一组的开头) // 或者按顺序操作,不要把自己绕晕 // 让我们重来最清晰的写法: // 先保存下一轮的起点 (3) let nextStart = node2.next; temp.next = node2; // dummy -> 2 node2.next = node1; // 2 -> 1 node1.next = nextStart; // 1 -> 3 // 4. 指针前进 // 此时链表是 dummy -> 2 -> 1 -> 3 -> 4 // 下一轮我们要站在 1 的位置,去处理 3 和 4 temp = node1; } return dummy.next; };

深度模拟

假设dummy -> 1 -> 2 -> 3 -> 4

  1. 初始temp = dummy

    • 检查:后面有 1 和 2。可以换。

    • node1 = 1,node2 = 2,nextStart = 3

    • 连线:dummy -> 22 -> 11 -> 3

    • 链表变:dummy -> 2 -> 1 -> 3 -> 4

    • 移动temp跳到1

  2. 第二轮temp = 1

    • 检查:后面有 3 和 4。可以换。

    • node1 = 3,node2 = 4,nextStart = null

    • 连线:1 -> 44 -> 33 -> null

    • 链表变:dummy -> 2 -> 1 -> 4 -> 3 -> null

    • 移动temp跳到3

  3. 结束temp后面没节点了,循环结束。

总结

这道题是“多指针操作”的典型训练。

  • 不要试图要在脑子里模拟三根线的变化,一定会晕。

  • 一定要画图,把步骤 1、2、3 标在纸上,代码自然就写出来了。

  • 只要掌握了这题,后面的 K 个一组翻转(LC 25)其实就是把“两两”变成了“K个”,逻辑是一模一样的。


下一题预告:删除链表的倒数第 N 个结点

练完了细致的指针操作,下一题LC 19. 删除链表的倒数第 N 个结点要考一点**“小聪明”**了。

  • 题目:只扫描一遍链表,怎么找到倒数第 N 个节点?

  • 技巧:快慢指针。让快指针先跑 N 步,然后两个指针一起跑。当快指针到头时,慢指针正好停在你想要的地方。

这是一种非常经典的**“尺子思维”**,准备好去测量链表的长度了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/8 0:59:00

学霸同款2026 AI论文平台TOP8:毕业论文写作全测评

学霸同款2026 AI论文平台TOP8:毕业论文写作全测评 2026年学术写作工具测评:如何选出适合你的论文助手 随着人工智能技术在学术领域的深入应用,越来越多的学生开始依赖AI工具辅助毕业论文的撰写。然而,面对市场上琳琅满目的平台&am…

作者头像 李华
网站建设 2026/1/6 7:15:15

uniapp+vue学生宿舍购电电费缴纳系统 小程序

目录系统概述核心功能技术亮点应用价值关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&#x…

作者头像 李华
网站建设 2026/1/9 19:16:51

教育行业新应用:利用HeyGem创建AI教师讲解视频课程

教育行业新应用:利用HeyGem创建AI教师讲解视频课程 在今天的在线教育环境中,一个常见的困境是——课程内容需要频繁更新,但每改一次就得重新拍摄、剪辑、配音,整个流程耗时又费力。尤其是面对多地区、多语言、多版本的教学需求时&…

作者头像 李华
网站建设 2026/1/7 23:43:17

uniapp+vue微信小程序的银行员工绩绩效考核系统 理财产品商城系统-vue

目录银行员工绩效考核与理财产品商城系统摘要关于博主开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/1/14 11:28:28

[精品]基于微信小程序的流浪动物救助领养平台 UniApp

文章目录 项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是:毕设制作流程系统性能核心代码系统测试详细视频演示源码获取 项目实现效果图 项目编号:035 所需技术栈 小程序…

作者头像 李华
网站建设 2026/1/13 17:23:08

[精品]基于微信小程序的企业内部订餐小程序 UniApp

文章目录 项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是:毕设制作流程系统性能核心代码系统测试详细视频演示源码获取 项目实现效果图 项目编号:045 所需技术栈 小程序…

作者头像 李华