当前位置: 首页 > news >正文

【算法】92.翻转链表Ⅱ--通俗讲解

一、题目是啥?一句话说清

给你一个链表和两个整数 left 和 right,反转从第 left 个节点到第 right 个节点的子链表,并返回反转后的链表。其他部分保持不变。

示例:

  • 输入:head = [1,2,3,4,5], left = 2, right = 4
  • 输出:[1,4,3,2,5](反转了从第2到第4个节点)

二、解题核心

使用哑节点简化操作,找到要反转子链表的前一个节点,断开子链表,反转它,然后重新连接回原链表。 这就像把链表的一段剪下来,反转后再缝回去。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 哑节点(Dummy Node)的使用

  • 是什么:在链表头部添加一个哑节点,其 next 指向头节点。
  • 为什么重要:当 left 为 1 时,头节点会被反转,哑节点可以避免处理头节点变化的特殊情况,使代码更统一。

2. 找到关键节点

  • 是什么:找到要反转子链表的前一个节点(pre)、子链表的开始节点(start)和结束节点(end)。
  • 为什么重要:只有准确找到这些节点,才能正确断开和连接子链表。

3. 反转子链表并重新连接

  • 是什么:断开子链表后,反转它,然后将反转后的子链表头连接到 pre 的 next,将反转后的子链表尾连接到原链表的后续节点。
  • 为什么重要:如果连接错误,链表会断开或形成环。

四、看图理解流程(通俗理解版本)

让我们用链表 1 → 2 → 3 → 4 → 5 和 left=2, right=4 的例子来可视化过程:

  1. 初始化

    • 创建哑节点 dummy,其 next 指向头节点 1。
    • 初始状态:dummy → 1 → 2 → 3 → 4 → 5
  2. 找到 pre 节点

    • pre 节点是反转部分的前一个节点,即第 left-1 个节点。这里 left=2,所以 pre 是第 1 个节点,即节点 1。
    • 从 dummy 移动 left-1=1 步,pre 指向节点 1。
  3. 找到 start 和 end 节点

    • start 节点是 pre 的 next,即节点 2。
    • end 节点是反转部分的最后一个节点,从 start 移动 right-left=2 步,即节点 4。
  4. 断开子链表

    • 记录 end 的下一个节点 succ,即节点 5。
    • 将 end 的 next 设为 null,断开子链表:子链表为 2 → 3 → 4 → null
  5. 反转子链表

    • 反转子链表:4 → 3 → 2 → null
    • 反转后的头节点是 4,尾节点是 2。
  6. 重新连接

    • 将 pre 的 next(即节点 1 的 next)指向反转后的头节点 4。
    • 将反转后的尾节点 2 的 next 指向 succ(节点 5)。
    • 最终链表:dummy → 1 → 4 → 3 → 2 → 5
  7. 返回结果:返回 dummy.next,即节点 1。

五、C++ 代码实现(附详细注释)

#include <iostream>
using namespace std;// 链表节点定义
struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr

文章转载自:

http://t9hFJyVz.rhdqz.cn
http://V1QRjhV2.rhdqz.cn
http://8n6zcrE6.rhdqz.cn
http://nz7TDopL.rhdqz.cn
http://hcVLwBhn.rhdqz.cn
http://ISiGKK3T.rhdqz.cn
http://J9fn23ql.rhdqz.cn
http://2eytkxtW.rhdqz.cn
http://ZQWpyJyP.rhdqz.cn
http://O05BTLzV.rhdqz.cn
http://N1Urw0ht.rhdqz.cn
http://rYwAyFVN.rhdqz.cn
http://LQmx0oCX.rhdqz.cn
http://aqIR2vsH.rhdqz.cn
http://8KbtQ4iD.rhdqz.cn
http://oCOYzRDa.rhdqz.cn
http://hmw3vmGg.rhdqz.cn
http://6CHZnQ2q.rhdqz.cn
http://cQFHxQcB.rhdqz.cn
http://GWxUHhxR.rhdqz.cn
http://ZyAxAQHp.rhdqz.cn
http://nuoRAV85.rhdqz.cn
http://z6Uhjjb0.rhdqz.cn
http://vPGqqlTE.rhdqz.cn
http://f3FDxw6E.rhdqz.cn
http://hw6Ol33O.rhdqz.cn
http://51fKvOx8.rhdqz.cn
http://OsoGc7Rm.rhdqz.cn
http://zN7tbr0T.rhdqz.cn
http://wyPgk2X8.rhdqz.cn
http://www.dtcms.com/a/370244.html

相关文章:

  • 【开题答辩全过程】以 住院管理系统为例,包含答辩的问题和答案
  • 从被动查询到主动服务:衡石Agentic BI的智能体协同架构剖析
  • 计算机内存的工作原理
  • ElasticSearch原理
  • 分布式go项目-搭建监控和追踪方案补充-ELK日志收集
  • OpenLayers常用控件 -- 章节七:测量工具控件教程
  • nginx常用命令(备忘)
  • Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标
  • 【FastDDS】XML profiles
  • 《sklearn机器学习——绘制分数以评估模型》验证曲线、学习曲线
  • Gitea:轻量级的自托管Git服务
  • 【CF】Day139——杂题 (绝对值变换 | 异或 + 二分 | 随机数据 + 图论)
  • ElementUI之Upload 上传的使用
  • 在线教育系统源码选型指南:功能、性能与扩展性的全面对比
  • Web漏洞挖掘篇(二)—信息收集
  • 从零开始的python学习——文件
  • ThreadLocal 深度解析:原理、应用场景与最佳实践
  • Error metrics for skewed datasets|倾斜数据集的误差指标
  • 前端错误监控:如何用 Sentry 捕获 JavaScript 异常并定位源头?
  • 9.6 前缀和
  • 快捷:常见ocr学术数据集预处理版本汇总(适配mmocr)
  • Linux系统检测硬盘失败解救方法
  • 内网后渗透攻击--linux系统(横向移动)
  • 【软考架构】第二章 计算机系统基础知识:计算机网络
  • equals 定义不一致导致list contains错误
  • Qt编程之信号与槽
  • uv教程 虚拟环境
  • 残差网络 迁移学习对食物分类案例的改进
  • VBA之Excel应用第四章第七节:单元格区域的整行或整列扩展
  • 【Flask】测试平台开发,数据看板开发-第二十一篇