news 2026/4/18 8:21:52

【小白笔记】反转链表 II

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【小白笔记】反转链表 II

处理链表区间反转的关键在于:找到待反转区间的前驱节点,并将该区间内的节点逐个“移到”前面。


1. 解题思路:一次遍历(穿针引线法)

为了简化边界条件(比如从第一个节点就开始反转),我们通常先创建一个虚拟头节点 (Dummy Node)

  1. 定位前驱节点:移动指针pre到待反转区间的前一个位置(第left - 1个节点)。
  2. 设置当前操作指针cur指向区间的第一个节点,next指向cur的下一个节点。
  3. 循环进行头插法:执行right - left次操作。每次将next节点插入到pre之后,从而实现局部反转。

2. 代码实现 (Python)

# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defreverseBetween(self,head:Optional[ListNode],left:int,right:int)->Optional[ListNode]:# 1. 设置 dummy node 防止 head 被反转的特殊情况dummy=ListNode(0)dummy.next=head pre=dummy# 2. 找到 left 的前一个节点for_inrange(left-1):pre=pre.next# 3. 开始局部反转cur=pre.nextfor_inrange(right-left):next_node=cur.next# 将 next_node 从链表中摘除,插入到 pre 后面cur.next=next_node.nextnext_node.next=pre.nextpre.next=next_nodereturndummy.next

3. 测试用例与结果

测试用例 1

  • 输入:head = [1, 2, 3, 4, 5],left = 2,right = 4
  • 过程简述:
    1. pre指向节点1
    2. 第一次循环:把3提到1后面。链表变为1 -> 3 -> 2 -> 4 -> 5
    3. 第二次循环:把4提到1后面。链表变为1 -> 4 -> 3 -> 2 -> 5
  • 预期输出:[1, 4, 3, 2, 5]

测试用例 2

  • 输入:head = [5],left = 1,right = 1
  • 预期输出:[5]

4. 复杂度分析

  • 时间复杂度:O(N)O(N)O(N),其中NNN是链表长度。我们只需要遍历一次链表。
  • 空间复杂度:O(1)O(1)O(1),我们只使用了常数级别的额外指针空间。

在 Python 中,for _ in range(n):是一种非常地道的写法,主要用于“只需要循环执行特定次数,但并不关心当前循环到第几次”的场景。

1. 下划线_的含义

在 Python 中,下划线_是一个约定俗成的占位符。

  • 通常for i in range(5):中的i会存储当前循环的索引(0, 1, 2…)。
  • 如果你在循环体内部完全不需要用到这个索引数字,使用_可以告诉阅读代码的人:“这个变量不重要,我只是想让这段代码运行nnn次。”

1. 为什么要定义dummy(虚拟头节点)?

在处理链表问题时,dummy节点就像是一个“救生圈”,它的主要作用是消除边界条件的特殊处理

  • 如果没有dummy
    如果left = 1,意味着你要从原链表的第一个节点开始反转。此时,反转后的“新头节点”会发生变化。你需要写额外的if...else逻辑来处理“头节点被改变”的情况。
  • 有了dummy
    我们将dummy.next指向head。无论你反转的是中间一段,还是从第一个节点开始反转,head节点都变成了“中间某个节点”。
    最终结果只需返回dummy.next,它永远指向反转后正确的起始位置,逻辑变得整洁统一。

2. 为什么用循环去找?(链表 vs 数组)

这正是由链表的物理结构决定的:

数组 (Python 的 List)
  • 特性:连续内存存储。
  • 查找:支持“随机访问”。你可以直接通过下标arr[i]O(1)O(1)O(1)时间内找到任何元素,就像查字典的页码一样快。
  • 缺点:插入或删除中间元素时,需要挪动后面的所有元素,非常费力。
链表 (Linked List)
  • 特性:分散内存存储,节点之间靠指针(地址)连接。
  • 查找:不支持随机访问。你想找第nnn个节点,必须从第一个节点开始,顺着next指针一个一个数过去(即你看到的for循环)。这就是O(N)O(N)O(N)的查找时间。
  • 优点:只要你找到了位置,插入和删除操作只需要改变指针指向,不需要移动数据,非常高效。

3. “定位到前一个”的必要性

在链表中,如果你想删除或移动节点B,你手里必须握着节点AB的前驱节点)的指针。

  • 因为链表是单向的,如果你直接跳到了left位置,你无法回过头去修改left-1节点的next指向。
  • 所以,我们必须“未雨绸缪”,让pre停在left的前一个位置,这样我们才能把后面反转好的部分重新接回到主链表上。

总结对比

特性数组 (List)链表 (Linked List)
访问第kkk个元素极快O(1)O(1)O(1)较慢O(k)O(k)O(k),必须遍历
中间插入/删除较慢O(N)O(N)O(N)极快O(1)O(1)O(1)(定位后)
适用场景频繁查询、尾部增删频繁在中间增删、容量动态变化

一句话总结:链表就像玩“寻宝游戏”,每一关只给你下一关的线索,所以你想去哪都得从第一关开始闯;而数组就像是有门牌号的公寓,你可以直接瞬移到任何一间房。

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

【案例共创】从0开始使用华为云开发者空间搭建房价预测模型

最新案例动态,请查阅【案例共创】从0开始使用华为云开发者空间搭建房价预测模型。小伙伴们快来领取华为开发者空间进行实操吧! 本案例由:梅科尔工作室提供 1 概述 1.1 案例介绍 华为云开发者空间,华为云为每个新生态开发者免费…

作者头像 李华
网站建设 2026/4/18 5:43:33

通宵测完NanoBanana Pro,我只想说,太牛逼了。

作为一名长期关注 AI 技术和数字创意工具的用户,最近我终于体验了谷歌最新发布的 Nano Banana Pro,这个图像生成模型真的是让我目瞪口呆。通宵一试,我只能说,这个工具简直是 划时代的神器,不仅技术极其强大&#xff0c…

作者头像 李华
网站建设 2026/4/18 7:54:30

算法题 重构字符串

重构字符串 问题描述 给定一个字符串 s,检查是否能重新排列其中的字符,使得任意两个相邻的字符都不相同。 如果可以重新排列,返回任意一个满足条件的字符串。如果不能,返回空字符串 ""。 示例: 输入: s &qu…

作者头像 李华
网站建设 2026/4/18 8:06:46

无人机红外图像下极小目标检测数据集,无人机红外小目标检测数据集 低空安防、机场净空监测、反无人机系统、鸟类迁徙监控 YOLOv8** 构建的 **无人机红外图像下极小目标检测系统

无人机红外图像下极小目标检测数据集,8302张,yolo和voc两种标注方式 4类,标注数量: Plane:飞机 2163 Drone:无人机 3120 Heli:直升机 2217 Bird:鸟类 1958 image num: 8302 1 1 以下是 无人机红外图像下极小目标检测数据集 的完…

作者头像 李华
网站建设 2026/4/18 5:39:39

qt-lambda信号槽机制

想要调查&#xff0c;lambda信号槽在用完后会不会自己回收 写入成员变量 private: std::function<void()> lambdaSlot; 初始化 lambdaSlot []() {qDebug() << "Lambda slot executed";// 可访问类成员&#xff08;如this指针&#xff09;};cpp代码展示…

作者头像 李华
网站建设 2026/4/18 8:00:28

Anaconda概述+零基础安装教程及虚拟环境配置教程

目录 一、Anaconda概述 核心优势 1、一站式环境管理 2、拥有强大的包管理能力 3、简化部署 4、附加工具 二、安装过程 1、下载安装包 2、安装软件 3、验证安装是否成功 一、Anaconda概述 Anaconda 是一个开源的 Python/R 数据科学发行版&#xff0c;由 Anaconda, Inc.&#xf…

作者头像 李华