Java单边表的局部翻转

反转链表 II

这是上一个翻转全部链表的进阶版,大家可以先去看我的上一篇博客

Java算法之单链表的全部翻转-CSDN博客

题目描述

给你单链表的头指针 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]

 方案一:两次遍历

这里需要调用上面提到的翻转全部链表的函数,这里就直接拿过来了如下:

    public ListNode reverseList1(ListNode head) {//指向需要改变指向节点的前一个结点//头节点的前一个节为nullListNode pre = null;//指向需要改变指向的节点ListNode cur = head;while(cur != null){//这个条件确保所有的节点全部调转指向ListNode temp = cur.next;//调转当前节点的指向cur.next = pre;//将两个指针全部后移一位pre = cur;cur = temp;}//最终cur指向了null//pre指向了原链表的最后一个节点也就是反转后列表的头节点return pre;}

这个函数的作用就是,传递一个链表的头结点,然后就可以将整条链表翻转

        这样看的话局部翻转的题目就可以分成三部分,除了中间红框圈起来的需要翻转部分,还剩下左边和右边的不需要反转的部分,那么这个题目就可以这样解:

通过遍历获取到left节点的前一个节点,和right节点的后一个节点,并且让right节点暂时指向null,并且创建一个新的引用newHead让它指向left节点。调用上面的reverseList1函数 ,参数就放newhead,这样一来,我们就得到了一条反转后的链表. 

        然后让左边部分的最后一个节点指向反转后链表的头节点也就是right节点,让反转后的尾节点指向右边第一个节点。

    public ListNode reverseBetween(ListNode head, int left, int right) {// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode pre = dummyNode;// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点// 建议写在 for 循环里,语义清晰for (int i = 0; i < left - 1; i++) {pre = pre.next;}// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点ListNode rightNode = pre;for (int i = 0; i < right - left + 1; i++) {rightNode = rightNode.next;}// 第 3 步:切断出一个子链表(截取链表)ListNode leftNode = pre.next;ListNode curr = rightNode.next;// 注意:切断链接pre.next = null;rightNode.next = null;// 调用完全反转函数reverseLinkedList(leftNode);// 第 5 步:接回到原来的链表中pre.next = rightNode;leftNode.next = curr;return dummyNode.next;}

方案二:一次遍历

        那么有没有什么办法可以只通过一次遍历就完成局部反转链表的功能呢?其实是有的,根据上面的思路,我们清楚了要想完成局部翻转,不仅需要完成局部翻转还需要让整条链表连接起来,所以我们需要在完成反转的同时,记录下几个重要的节点:

        1.是left节点和left节点的前一个节点

        2.是right节点和right节点的下一个节点

看过我上一篇实现链表完全翻转的博客的同学应该应该还记得,我们完成链表反转后,per指针指向的就是链表最后一个节点,而cur指向的就是per的下一个节点,如果将这个需要翻转部分的链表当做是上一篇博客中需要完全翻转的链表的话,当翻转完成时,per指向的就是right节点,cur就是指向了right的下一节点。

left节点left的前一节点也可以在同一次遍历中获得,然后只需让left的前一节点指向pre指向的节点,left节点指向cur指向的节点就可以了。

这时我们不得不考虑一下left为第一个节点的情况,这样就不会有left的前一节点,为了避免这种分情况讨论的麻烦,我们创建了一个哑结点(不存储任何数据),让它的next域指向头结点,这样一来,无论如何left节点总会有前一节点。

        ListNode dunnmy = new  ListNode();
        dunnmy.next = head;

 初始状态

 假设left值为2,right值为4,找到left节点,并用p0指针记录left的前一节点的位置

反转完成后

我们可以看到per向后移动了3个节点,所以迭代次数为right-left+1次

p0的next域指向了left节点

最终

        p0.next.next = cur;
        p0.next = pre;

 拉直后

    //反转两个节点及其中间的节点public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dunnmy = new  ListNode();dunnmy.next = head;//保存下需要反转的节点的前一个节点//反转节点//将反转后节点指向后一节点ListNode pre = null;ListNode cur = dunnmy;ListNode p0;//用来存储left的前一节点for(int i=0;i<left;i++){pre = cur;cur = cur.next;}p0 = pre;pre = null;for(int i=0;i<right-left+1;i++){//总共需要反转的链条数量是right-left+1,包括让left节点暂时指向nullListNode temp = cur.next;cur.next = pre;pre = cur;cur = temp;}//现在pre指向的是right节点,cur指向的是right的下一节点//p0.next.next就是left节点的next域p0.next.next = cur;p0.next = pre;return dunnmy.next;}

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

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

相关文章

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat 0. 引言1. lmdeploy 性能2. lmdeploy 支持的模型3. 快速开始 0. 引言 LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发&#xff0c;是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能&a…

webRtc架构与目录结构

整体架构 目录结构 webrtc Modules目录

Redis实践经验

优雅的Key结构 Key实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:id例&#xff1a;login:user:10长度步超过44字节&#xff08;版本不同&#xff0c;上限不同&#xff09;不包含特殊字符 优点&#xff1a; 可读性强避免key冲突方便管理节省内存&#x…

使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

作者&#xff1a;来自 Elastic Amy Ghate, Rishikesh Radhakrishnan, Hemant Malik 使用非结构化和 Elasticsearch 向量数据库为 RAG 应用程序提取和搜索复杂的专有文档 在使信息可搜索之前解析文档是构建实际 RAG 应用程序的重要步骤。Unstructured.io 和 Elasticsearch 在此…

mybatis动态传入参数 pgsql 日期 Interval ,day,minute

mybatis动态传入参数 pgsql 日期 Interval 在navicat中&#xff0c;标准写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL 5 day)在mybatis中&#xff0c;错误写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL#{numbers,jdbcTypeINTEGER} day)报错内…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素&#xff08; position:relative&#xff0c;position:absolute&#xff0c;position:fixed &#xff09;有效&#xff0c;默认值为0&#xff0c;可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时&#xff0c;后面的元素在…

python | setup.py里有什么?

setup.py里有什么&#xff1f; 文章目录 setup.py里有什么&#xff1f;C/C扩展总结gcc/g的编译参数&#xff1a;Windows Visual StudioCmakesetup.py C/C扩展模块 为什么需要分发打包&#xff1f;Distutils一个简单的例子通用的 Python 术语 使用 Setuptools 构建和分发软件包源…

Android Gantt View 安卓实现项目甘特图

需要做一个项目管理工具&#xff0c;其中使用到了甘特图。发现全网甘特图解决方案比较少&#xff0c;于是自动动手丰衣足食。 前面我用 Python和 Node.js 前端都做过&#xff0c;这次仅仅是移植到 Android上面。 其实甘特图非常简单&#xff0c;开发也不难&#xff0c;如果我…

Python番外篇:万法归一,一切皆对象

目录 Python中的对象 一切皆对象 数字是对象 字符串是对象 内置类型也是对象 函数和类也是对象 总结 Python中的对象 对象是Python对数据的抽象&#xff0c;在Python程序中&#xff0c;所有的数据&#xff0c;都可以由对象或对象之间的关系表示。 从某种意义上说&#…

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

《昇思25天学习打卡营第14天|SSD目标检测》

SSD&#xff08;Single Shot MultiBox Detector&#xff09;是一种用于目标检测的深度学习算法。它的设计旨在同时检测多个对象&#xff0c;并确定它们在图像中的位置和类别。与其他目标检测算法相比&#xff0c;SSD具有速度快和精度高的特点&#xff0c;在实时检测应用中非常受…

昇思25天学习打卡营第18天|MindNLP ChatGLM-6B StreamChat

现在各类chat AI不胜枚举&#xff0c;开源的闭源的都有&#xff0c;ChatGLM-6B是其中一个开源的chat AI模型&#xff0c;我们可以使用mindspore轻松的跑起来这个模型 官方提供的jupyter示例里面却少了安装mindnlp和mdtex2html&#xff0c;所以需要先把这两个模块安装一下。 !…

【Dison夏令营 Day 17】使用 Python Turtle 的 24 游戏求解器

24 点 是一个数学谜题&#xff0c;用基本算术运算符&#xff08;、-、、&#xff09;将 4 个数字运算成 24。例如&#xff0c;给定 4 个数字 1,5,5,5&#xff0c;我们可以得到表达式 (5-(15))5&#xff0c;等于 24。 我们可以用 Python 程序暴力解决这个问题。最多有 245444 7…

【游戏客户端】大话slg玩法架构(三)建筑控件

【游戏客户端】大话slg玩法架构&#xff08;三&#xff09;建筑控件 大家好&#xff0c;我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS&#xff1a;和之前…

谈谈软件交互设计

谈谈软件交互设计 交互设计的由来 交互设计(Interaction Design)这一概念,最初是由IDEO创始人之一Bill.Moggridge(莫格里奇)1984年在一次会议上提出。他设计了世界上第一台笔记本电脑Compass,并写作出版了在交互设计领域影响深远的《Designing Interactions》一书,被称…

请不要把「团队」二字挂在嘴边上

请不要把「团队」二字挂在嘴边上 什么是团队? 团队(Team)是由 基层和 管理层人员组成的一个 共同体,它合理利用每一个 成员的知识和技能协同工作,解决问题,达到 共同的目标。 团队的构成要素总结为5P,分别为目标、人、 定位、权限、计划。 群体不是团队 “团队”和“…

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展&#xff0c;智能合约和分布式应用&#xff08;DApps&#xff09;逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议&#xff0c;能够在预设条件满足时自动执行代码&#xff0c;而无需人工干预或中介机构。这种自动化和信任机制极大…

使用Apache服务部署静态网站

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、网站服务程序 ​二、配置服务文件参数 ​三、SELinux安全子系统 四、个人用户主页功能 ​五、虚拟网站主机功能 六、Apache的访问控制…