LeetCode题练习与总结:反转链表Ⅱ--92

news2024/11/19 1:47:16

一、题目描述

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

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

示例 2:

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

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

二、解题思路

  1. 初始化: 创建一个哑结点 dummy,其 next 指针指向 head。这样,即使 head 发生变化,我们也可以通过 dummy.next 获取到新的头结点。同时,我们还需要设置两个指针 pre 和 cur,分别初始化为 dummy

  2. 定位: 将 pre 移动到 left - 1 的位置,将 cur 移动到 left 的位置。

  3. 反转链表: 从 left 到 right,我们需要反转这部分链表。我们可以使用头插法进行链表的反转。具体来说,对于 cur 当前指向的节点,我们将其从链表中取出,然后将其插入到 pre 和 pre.next 之间。

  4. 返回结果: 反转完成后,返回 dummy.next 即为新的头结点。

三、具体代码

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        
        // 定位到left的前一个节点
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }
        
        // cur是left位置的节点
        ListNode cur = pre.next;
        
        // 反转left到right的链表
        for (int i = 0; i < right - left; i++) {
            ListNode temp = cur.next; // 取出下一个节点
            cur.next = temp.next; // 断开连接
            temp.next = pre.next; // 插入到pre和pre.next之间
            pre.next = temp;
        }
        
        return dummy.next;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 定位到 left 的前一个节点的循环会运行 left - 1 次。
  • 反转链表的循环会运行 right - left 次。
  • 因此,总的时间复杂度是 O(n),其中 n 是链表的长度。在最坏的情况下,left 和 right 可能分别接近 1 和 n,这将使得时间复杂度接近 O(n)
2. 空间复杂度
  • 该算法只使用了几个额外的节点(dummyprecurtemp),不管链表有多长,这些额外的节点数量都是固定的。
  • 因此,空间复杂度是 O(1),即常数空间复杂度。

综上所述,该算法的时间复杂度是 O(n),空间复杂度是 O(1)

五、总结知识点

1. 链表操作

  • 链表节点的定义:使用 ListNode 类来定义链表节点,每个节点包含一个 val 属性和一个 next 指针。
  • 链表的遍历:通过节点的 next 指针遍历链表。
  • 链表的插入:在链表中插入一个新节点,需要修改相邻节点的 next 指针。

2. 哑结点的使用

  • 哑结点(dummy)是一个辅助节点,通常用于简化边界条件的处理。在这个问题中,它被用来确保即使在链表的头部进行操作,也能保持代码的一致性。

3. 指针的概念

  • pre 和 cur 是两个指针,用于跟踪链表中的当前位置。pre 指向当前节点的前一个节点,而 cur 指向当前节点。

4. 链表的反转

  • 通过改变节点的 next 指针方向,可以实现在原地反转链表的部分区间。这是通过将每个节点移动到链表的前端来完成的,这个过程通常称为头插法。

5. 循环的使用

  • 两个 for 循环被用来定位到需要反转的链表部分,以及执行实际的反转操作。

6. 边界条件的处理

  • 代码中通过 left - 1 和 right - left 来确定循环的次数,这样可以确保正确地定位到需要反转的链表区间,并且反转正确的节点数量。

7. 函数返回值

  • 函数返回 dummy.next,这是因为 dummy 是一个哑结点,它的 next 指针指向链表的真正头部。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

e 值的故事:从复利到自然增长的数学之旅

自然对数函数的底数 e&#xff08;也称为自然常数或欧拉数&#xff09;与 π 一样&#xff0c;是数学中最伟大的常数之一。它大约为 2.718281828&#xff0c;是一个无理数&#xff0c;意味着它的小数部分无限且不重复。 与 π 和 √2 这些由几何发现而来的常数不同&#xff0c…

【高阶数据结构】图 -- 详解

一、图的基本概念 图 是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)。其中&#xff1a; 顶点集合 V {x | x属于某个数据对象集} 是有穷非空集合&#xff1b; E {(x,y) | x,y属于V} 或者 E {<x, y> | x,y属于V && Path(x, y…

解决常见的Android问题

常见问题&#xff1a; 1、查杀&#xff1a; 查杀一般分为两个方向一种是内存不足的查杀&#xff0c;一种的是因为温度限频查杀&#xff0c;统称为内存查杀&#xff0c;两个问题的分析思路不同 1、内存不足查杀&#xff1a; 主要是因为当用户出现后台运行多个APP或者是相机等…

LeetCode96:不同的二叉搜索树

题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 代码 /*dp[i]&#xff1a;表示i个节点有dp[i]个不同的二搜索叉树递推公式&#xff1a;dp[i] dp[j-1] * dp[i-j], j…

【JavaSE】/*运算符—快速总结*/

目录 前言 一、什么是运算符 二、算术运算符 三、增量运算符 四、自增/自减运算符 五、关系运算符 六、逻辑运算符 七、位运算符 八、移位运算符 九、条件运算符 十、运算符的优先级 前言 Java 中的运算符和 C语言 的运算符规则有很多类型的地方&#xff0c;我们只…

K8s源码分析(二)-K8s调度队列介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 本次分析参考的K8s版本是 文章目录 调度队列简介调度队列源代码分析队列初始化QueuedPodInfo元素介绍ActiveQ源代码介绍UnschedulableQ源代码介绍**BackoffQ**源代码介绍队列弹出待调度的Pod队列增加新的待调度的Podpod调…

LinkedList链表

LinkedList 的全面说明 LinkList底层实现了双向链表和双端队列特点可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括null线程不安全&#xff0c;没有实现同步 LinkedList 的底层操作机制 LinkedList底层维护了一个双向链表LinkList中维护了两个属性fi…

【C#进阶】简单数据结构类

简单数据结构类 文章目录 1、Arraylist1、ArrayList的本质2、声明3、增删查改4、装箱拆箱思考 背包售卖 2、Stack1、Stack的本质2、声明3、增取查改4、遍历思考 计算一个数的二进制 3、Queue1、Queue的本质2、声明3、增取查改4、遍历思考 每隔一段时间打印一条消息 4、Hashtab…

运营商的mpls专线

在当今高速发展的数字化时代&#xff0c;网络已成为企业发展不可或缺的基础设施。作为企业网络 连接的重要组成部分&#xff0c;MPLS专线在运营商的推动下逐渐成为了企业选择的首选。 MPLS&#xff08;Multi-Protocol Label Switching&#xff09;是一种基于标签的交换技术&am…

QT C++(QWidget类及其常见的属性)

文章目录 1. QWidget类及其常见的属性 1. QWidget类及其常见的属性 QT各种控件都是继承自QWidget类&#xff0c;QWidget类是QT控件体系中通用的部分。 QWidget属性如下图 常见的QT属性为&#xff1a; enabled&#xff1a;描述控件是否处于可用状态&#xff08;禁用状态这个…

ssrf学习2——内网ip绕过

环回地址绕过 尝试访问内网 也就是127.0.0.1里面的flag.php 但是如果真的去访问127.0.0.1/flag.php 还是不行 也就是说127.0.0.1被过滤了 进制转换 127.0.0.1是点分十进制 可以用二进制八进制十六进制来绕过过滤 0x7F000001/flag.php 017700000001/flag.php(八进制前面是…

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型&#xff0c;它是 YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎&#xff0c;特别是在需要实时目标检测的应用中&#xff0c;如视频监控、自动…

docker搭建mysql集群实现主从复制

前言 随着业务的增长&#xff0c;一台数据服务器已经满足不了需求了&#xff0c;负载过重。这个时候就需要减压了&#xff0c;实现负载均衡和读写分离&#xff0c;一主一丛或一主多从。 主服务器只负责写&#xff0c;而从服务器只负责读&#xff0c;从而提高了效率减轻压力。 …

docker安装nginx支持ssl 实现https访问(完整版)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 本文简介 2. docker安装nginx支持ssl2.0 准备ssl证书(例: 阿里云)2.0.1 配置域名解析2.0.2 找到数字证书管理服务并签发ssl证书2.0.3 选择默认证书 填写域名 创建2.0.4 提交审核, 签发成功2.0.5 解压并上传到宿主机ssl路径下 …

<网络安全>《83 微课堂<国家数据要素总体框架>》

1 总体框架 国家数据要素化总体框架由“六横两纵”共八个关键环节构成。 2 国家数据基础设施&#xff08;NDI&#xff09; 最底部第一层是国家数据基础设施&#xff08;NDI&#xff09;。国家数据基础设施&#xff08;NDI&#xff09;是经济社会进入数据要素化发展新阶段后新…

Vue面试经验2

Vue 你说你在vue项目中实现了自定义指令&#xff0c;如何实现 全局指令在main.js入口文件中实现 使用方法&#xff1a;v-指令名称 每个钩子函数都有两个参数&#xff08;ele,obj&#xff09; ele:绑定指令的元素 obj:指令的一些信息&#xff08;比如绑定指令的值&#xff0c…

Python Pendulum:用代码提升您的时间管理技能

更多Python学习内容&#xff1a;ipengtao.com Python中的Pendulum库是一个强大的日期和时间处理工具&#xff0c;提供了丰富的功能和灵活的接口&#xff0c;用于处理日期、时间、时区等相关操作。本文将全面介绍Pendulum库的主要功能、使用方法和实际应用场景&#xff0c;并给出…

基于ESP32和ESP8266的物联网开发过程(二)

在做这个项目前&#xff0c;也做了一些调研。项目的初衷是想要用于智能家居。我比较了小米IoT、阿里云、ESPHOME、巴沙云、点灯科技和ONENET等几个平台。最终选择了Onenet&#xff0c;部分原因是之前用过它的多协议版本&#xff0c;但现在这个版本已经下线了。 小米IoT的公测名…

使用FFmpeg处理RTSP视频流并搭建RTMP服务器实现图片转直播全流程

目录 一、FFmpeg安装与配置教程二、搭建并配置Nginx RTMP服务器三、从RTSP视频流提取帧并保存为图片四、将图片序列转换为视频五、将视频推送为直播流六、将图片序列推送为直播流 在实时音视频领域&#xff0c;我们经常需要处理从各种源&#xff08;如摄像头&#xff09;获取的…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…