【力扣】92. 反转链表 II <链表指针>

news2024/11/19 22:36:28

【力扣】92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 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

题解

一次遍历「穿针引线」反转链表(头插法)。
思想是:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。

输入
在这里插入图片描述
整个流程
在这里插入图片描述

实现原理
三个指针变量 precurrnext 来记录反转的过程中需要的变量,它们的意义如下:

  • curr:指向待反转区域的第一个节点 left;
  • next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化;
  • pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。

具体实现

  • 先将 curr 的下一个节点记录为 next
  • 执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;
  • 执行操作 ②:把 next 的下一个节点指向 pre 的下一个节点;
  • 执行操作 ③:把 pre 的下一个节点指向 next。
	//先将 curr 的下一个节点记录为 next
	next = cur.next;
	// 操作1:把 curr 的下一个节点指向 next 的下一个节点;
	cur.next = next.next;
	// 操作2:把 next 的下一个节点指向 pre 的下一个节点
	next.next = pre.next;
	// 操作3:把 pre 的下一个节点指向 next。
	pre.next = next;

在这里插入图片描述
完成以后链表拉直后:
在这里插入图片描述
同理继续。同样需要注意 穿针引线 操作的先后顺序:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val;this.next = next; }
}

//整体思想:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置
public class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {

        // 设置 dummyNode 是这一类问题的一般做法
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        // pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。
        ListNode pre = dummyNode;
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }

        // curr:指向待反转区域的第一个节点 left
        ListNode cur = pre.next;
        // next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化
        ListNode next;

        for (int i = 0; i < right - left; i++) {
            //先将 curr 的下一个节点记录为 next
            next = cur.next;

            // 操作1:把 curr 的下一个节点指向 next 的下一个节点;
            cur.next = next.next;

            // 操作2:把 next 的下一个节点指向 pre 的下一个节点
            next.next = pre.next;

            // 操作3:把 pre 的下一个节点指向 next。
            pre.next = next;
        }
        return dummyNode.next;
    }
}

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

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

相关文章

JVM面试突击1

JVM面试突击 JDK&#xff0c;JRE以及JVM的关系 我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .java 文件转换成了 .class 文件&#xff0c;实际上就是文件格式的转换&#xff0c;对等信息转换。 类加载机制是什么&#xff1f; 所谓类加载机制就是 虚拟机把Class文…

Prometheus实现系统监控报警邮件

Prometheus实现系统监控报警邮件 简介 Prometheus将数据采集和报警分成了两个模块。报警规则配置在Prometheus Servers上&#xff0c; 然后发送报警信息到AlertManger&#xff0c;然后我们的AlertManager就来管理这些报警信息&#xff0c;聚合报警信息过后通过email、PagerDu…

怎么迅速做出高端、还会动的数据图表?来看看这五个大数据可视化神器!

什么叫大数据可视化&#xff1f; 其实很简单。大数据可视化就是指通过图表、图形、地图等视觉化方式&#xff0c;将庞大、复杂的大数据集合转化为直观、易于理解和分析的图像展示。 它的目的是帮助人们更好地理解和解释大数据&#xff0c;发现数据中的模式、趋势和关联&#…

CLion中avcodec_receive_frame()问题

1. 介绍 在提取音视频文件中音频的PCM数据时&#xff0c;使用avcodec_receive_frame()函数进行解码时&#xff0c;遇到了一些问题&#xff0c;代码在Visual Studio 2022中运行结果符合预期&#xff0c;但是在CLion中运行时&#xff0c;获取的AVFrame有错误&#xff0c;和VS中获…

谈「效」风生 |“效能指标”,该由谁来定义?

#第5期&#xff1a;效能指标&#xff0c;该由谁来定义&#xff1f;# 回顾上期《「自动化」聊起来简单&#xff0c;做起来难》我们聊了聊如何打造「自动化」的事&#xff0c;这也是真正实现研发效能提升的必要条件。从单点自动化提升效率&#xff0c;到全工具链自动化&#xff…

【Java环境不会搭建?一文带你读懂Windows下安装Java!】

JKD下载网址 —— https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 1、如果你是32位系统下载 jdk-8u241-windows-i586.exe&#xff08;32位&#xff09;&#xff1b; 2、如果你是64位系统下载 jdk-8u241-windows-x64.exe&#xff08;64位&…

【freespace】HybridNets: End-to-End Perception Network

目录 摘要 1. 介绍 1.1. 背景 1.2. 相关工作 2. 方法 2.1. 网络体系结构 2.2. 编码器 2.3. 译码器 2.4. 损失函数和训练 3. 实验与评估 3.1. 实验设置 3.2. 评价指标 3.3. 成本计算性能 3.4. 多任务性能 4. 结论与展望 摘要 端到端网络在多任务处理中变得越来越重要…

Godot 4 源码分析 - 增加格式化字符串功能

Godot 4的主要字符串类型为String&#xff0c;已经设计得比较完善了&#xff0c;但有一个问题&#xff0c;格式化这块没怎么考虑。 String中有一个format函数&#xff0c;但这个函数只有两个参数&#xff0c;这咋用&#xff1f; String String::format(const Variant &va…

Rocketmq 定时消息源码分析

定时消息定义 生产者将消息投放到broker后&#xff0c;不会马上被消费者消费。需要等待到特定时间才会被消费。 调用链路 producer 将定时消息写入commitLog线程ReputThead 休息1毫秒&#xff0c;读取一次commitlog数据&#xff0c;写入ConsumeQueue和IndexFile线程Scheduled…

所学即所用:方飞将AI技术运用于反偷猎领域

原创 | 文 BFT机器人 方飞&#xff0c;高中毕业于江苏省常州高级中学&#xff0c;于2007年进入清华大学电子工程系攻读学士学位&#xff0c;2011年本科毕业后赴美国南加州大学计算机系攻读博士&#xff0c;主要从事安全博弈研究&#xff0c;师从安全博弈领域的权威专家 Milind…

vxworks文件系统分析

参考https://www.freebuf.com/articles/endpoint/335030.html 测试固件 https://service.tp-link.com.cn/detail_download_7989.html 固件提取 binwalk解压固件&#xff0c;在第一部分即为要分析的二进制文件&#xff0c;可以拖进ida分析 设置为arm小端字节序&#xff0c;点…

爆火的“为i做e”梗,小红书如何成为年轻人的社交货币?

话题浏览超13亿&#xff0c;“新社交密码”抢占用户心智 2023-08-03 草稿临时预览&#xff0c;有效期剩余59分59秒 请勿包含诱导分享&#xff0c;虚假中奖&#xff0c;违法违纪等信息。 爆火的“为i做e”梗、将MBTI写进个人简介、花样百出的MBI梗图 ...... 从去年5月到现在&…

手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)

简介 首先声明此篇文章主要是针对测试菜鸟或者刚刚入门的小伙们或者童鞋们&#xff0c;大佬就没有必要往下看了。 写这篇文章的由来是因为后边要用这个工具&#xff0c;但是由于某些原因有部分小伙伴和童鞋们可能不会安装此工具&#xff0c;为了方便小伙伴们和童鞋们的后续学习…

第五届宁波市卫生健康系统信息化技能竞赛暨赛前培训成功举办 平凯星辰受邀授课

近日&#xff0c; 第五届宁波市卫生健康系统第五届信息化技能竞赛暨赛前培训在宁波饭店成功举办 。本次培训吸引了来自区、县、市属各级医疗单位的信息化相关负责人参与。宁波市卫生信息中心副主任唐玲作主题发言&#xff0c; 平凯星辰作为中国数据库代表厂商&#xff0c;受邀进…

企业级,Pytest自动化测试框架脚本编写总结,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 用到的知识点&…

web爬虫第四弹 - JS逆向入门(猿人学第一题)

0- 前言 爬虫是一门需要实战的学问。 而对于初学者来说&#xff0c;要想学好反爬&#xff0c;js逆向则是敲门砖。今天给大家带来一个js逆向入门实例&#xff0c;接下来我们一步一步来感受下入门的逆向是什么样的。该案例选自猿人学练习题。猿人学第一题 1- 拿到需求 进入页面…

矩阵怎么求导数(学习笔记)

当标量 拓展到向量的时候 需要弄清楚形状 这里 看图大概是不清晰的 先要看清楚谁是向量 y 是向量 x 是标量 求导之后 仍然还是向量 y 是标量 x 是向量 求导之后 仍然还是向量 两个都是向量 求导之后 是矩阵 标量大家都会的 啊 求导 的意义很重要 如图所示 梯度一定指…

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验一 点亮第一个LED

目录 前言 一、原理图及知识点介绍 1.1、LED原理图 1.2、MCU51原理图 二、代码分析 知识点一&#xff1a;#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 知识点二&#xff1a;你知道sfr P0 0x80;是怎么来的呢为什么要赋值0x80&#xff…

Java基础面试题2

Java基础面试题 一、IO和多线程专题 1.介绍下进程和线程的关系 进程&#xff1a;一个独立的正在执行的程序 线程&#xff1a;一个进程的最基本的执行单位&#xff0c;执行路径 多进程&#xff1a;在操作系统中&#xff0c;同时运行多个程序 多进程的好处&#xff1a;可以充…

7种有效安全的网页抓取方法,如何避免被禁止?

网页抓取是一种从互联网上抓取网页内容的过程&#xff0c;但在网络抓取种相信您也经常遇到障碍&#xff1f;尤其是做跨境业务的&#xff0c;在抓取国外的网站时更有难度。但我们站在您的立场上&#xff0c;提供七种有效的方法来进行网页抓取而不被阻止&#xff0c;最大限度地降…