反转链表问题的递归解法

news2025/8/9 9:08:24

目录

一、反转整个链表

二、反转部分链表


一、反转整个链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 首先在方法中我们需要判断递归终止的情况,如果head==null或者head.next==null,那么我们就可以直接返回head。这不仅仅是递归种植的条件也是当head为空或者head只有一个元素的特殊情况的处理方法。

  然后假设我们已经将递归进行到最后一个元素,即调用一次一次的reverseList(head.next),使方法中的head变成最后一个结点,然后直接返回最后一个结点。

 然后我们用node来接收刚刚返回的head,并且在接收前就用sec存储当前方法的head.next。

 然后我们让sec.next = head(也就是node.next = head),即调换两者的位置,然后让head.next = null,再返回node到上一次递归。

 这时的我们再继续刚刚的操作。

 一直递归下去,就会得到反转后的链表。返回node即可。

    public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode sec = head.next;
        ListNode node = reverseList(head.next);
        sec.next = head;
        head.next = null;
        return node ;
    }

二、反转部分链表

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

 有了反转整个链表之后我们做这道题就简单很多了,首先创建一个count变量,用它来判断是否到达需要反转的位置,如实例一中是从第二个位置开始反转,所以当不满足count>=left&&count<=right条件时,我们只需要让node = head然后,node.next = reverseBetween(head.next,left,right);直接连接上即可。

当满足条件时则进行反转,这个情况下递归的终止条件就变成了left==right,每一次递归都让left+1,最后当left==right时直接返回head即可。

这里有一个特殊情况就是head后面还会有元素,我们不能像之前一样将head.next置为空,设置一个变量successor,初始值为null,让他来存储最后剩余的部分链表,如果没有剩余链表,那么head.next则也是置为空了,如果有连接上即可。

    int count = 0;
    ListNode successor = null;
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left==right){
            successor = head.next;
            return head;
        }
        count++;
        ListNode node = null;
        if(count>=left&&count<=right){
            ListNode sec = head.next;
            node = reverseBetween(head.next,left+1,right);
            sec.next = head;
            head.next =successor;
        }else{
            node = head;
            node.next = reverseBetween(head.next,left,right);
        }
        return node;
    }

 

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

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

相关文章

【快速上手系列】保姆级Layuimini与SSM的联合使用教程(数据表格操作)

【快速上手系列】保姆级Layuimini与SSM的联合使用教程&#xff08;数据表格操作&#xff09; 使用步骤 导入layuimini 下载layuimini文件 这个并不是直接运行的&#xff0c;需要用HBuilder导入 layuimini的项目路径 我用的是iframe版&#xff0c;个人更喜欢这种的&#x1…

Git -- submoudule子模块使用

文章目录子模块的作用添加子模块拉取带子模块的项目修改子模块代码子模块的作用 通常情况下&#xff0c;我们做项目时会有几个业务功能区分比较明确的模块&#xff0c;比如简单来说&#xff0c;一个项目我们可以分为认证授权模块、工具类模块、常规业务模块。 而像认证…

【外卖项目实战开发一】

文章目录1、软件开发整体介绍2、外卖项目介绍3、环境搭建数据库环境搭建创建数据库执行SQL脚本数据表maven项目搭建添加依赖:application.yml配置application启动类4、后台登录功能开发需求分析代码开发5、后台退出功能开发1、软件开发整体介绍 软件开发流程 角色分工 软件…

基于JAVA的企业人力人事资源管理系统OA,部门、人员、薪资、招聘功能齐全的项目【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427647 摘要 随着知识经济的崛起&#xff0c;掌握了高新技术和具有现代管理理念的人已成为经济发展的原动力。一个企业要在市场竞争中取得优势地位&#xff0c;依靠的主要不是物质资源&…

FCPX插件:Stupid Raisins Title Pop (78个动画标题+2个额外背景)

fcpx插件&#xff1a;Stupid RAIsins Title Pop for Mac激活版是兼容Final Cut Pro x的一款动画标题字幕插件。Stupid RAIsins Title Pop mac版包含78个fcpx动画标题2个额外背景&#xff0c;可以快速拖放编辑&#xff0c;使用基本&#xff0c;连续&#xff0c;充满活力&#xf…

电容笔做的比较好的品牌有哪些?高性价比电容笔测评

现在&#xff0c;高技术在推动数字产品的发展&#xff0c;同时也在增加。不管是工作还是学习&#xff0c;大屏幕可以使图像更加清晰。无论现在或将来&#xff0c;平板电脑都将成为我们日常生活中不可或缺的一部分。一款简单易用的电容笔&#xff0c;能够极大地提高我们的工作效…

7.9 用户接口

目录 一 序言 二 应用层实现 三 内核层实现 一 序言 这一部分&#xff0c;我们简单介绍一下用户接口。从本质上讲&#xff0c;操作系统就是对计算机硬件资源进行一个封装&#xff0c;从而方便用户来使用。前面几部分&#xff0c;我们重点介绍了操作系统自身的一些功能&#…

SpringBoot SpringBoot 原理篇 1 自动配置 1.5 proxyBeanMethod

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.5 proxyBeanMethod1.5.1 ImportResource1.5.2 proxyBeanMethod1 …

Qt使用QAudioInput、QAudioOutput实现局域网的音频通话

本文旨在介绍一下用Qt来实现局域网音频通话功能 技术实现 QAudioInput、QAudioOutput&#xff08;Qt采集和播放音频类&#xff09; QUdpSocket&#xff08;Qt的UDP通信类&#xff09; 话不多说&#xff0c;直接上代码链接&#xff0c;想下载的朋友可以直接去gitee下载。 整体…

项目管理范围(上)

范围管理概述 产品范围与项目范围的区别&#xff1a; 产品范围是指产品或者服务所应该包含的功能&#xff0c;项目范围是指为了能够交付产品&#xff0c;项目所必须做的工作。 什么是WBS&#xff1f; 工作分解结构&#xff08;简称WBS&#xff0c; Work Breakdown Structure…

科学孕育:婴幼儿食物过敏怎么办?

近年来&#xff0c;食物过敏的发病率呈明显上升趋势&#xff0c;已成为危害儿童健康的全球性问题。据统计&#xff0c;我国儿童食物过敏的发病率为3%~10%[1]。其中&#xff0c;0~4岁婴幼儿和学龄前儿童食物过敏的发病率最高。婴儿过敏反复发生.具有湿疹和食物过敏史的婴儿易患哮…

热门Java IDE——MyEclipse的数据库和持久化支持

MyEclipse支持开发者使用Java EE、Spring、JPA、Hibernate和POJOs快速开发以数据库为中心的应用程序&#xff0c;通过使用JDBC标准和嵌入式Derby数据库的数十个数据库的连接器&#xff0c;开发人员可以快速启动并运行。从持久性到逆向工程&#xff0c;再到可视化ER模型&#xf…

JS if else语句详解

在正常情况下&#xff0c;JavaScript 脚本是按顺序从上到下执行的&#xff0c;这种结构被称为顺序结构。如果使用 if、else/if 或 switch 语句&#xff0c;可以改变这种流程顺序&#xff0c;让代码根据条件选择执行的方向&#xff0c;这种结构被称为分支结构。 if语句 if 语句…

【微信小程序】实现页面跳转功能

&#x1f3c6;今日学习目标&#xff1a;第十三期——实现页面跳转功能 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;20分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言实现效果事件如…

Unity3D占用内存太大怎么解决呢? -下

什么时候才是UnusedAssets?看一个例子&#xff1a; Object obj Resources.Load("MyPrefab"); GameObject instance Instantiate(obj) as GameObject; ......... Destroy(instance); 创建随后销毁了一个Prefab实例&#xff0c;这时候 MyPrefab已经没有被实际的物体…

传奇列表获取失败与登录器太老怎么解决

一.登录器列表读取失败,无法获取登录器远程列表解决方案 1.查看登陆器列表地址是否能正常访问&#xff0c;登陆器读取的列表地址都是一个txt文本格式。如下图&#xff1a; 例如&#xff1a;我们的列表为: http://域名/123.txt&#xff0c;我们把列表复制到浏览器中查看是否能正…

锐捷MPLS跨域方案C1实验配置

目录 配置IPv4的BGP邻居 配置PE之间的Vpnv4邻居 此时配置PE与CE设备对接命令 手工配置为PE地址分配标签 MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客https://blog.csdn.net/m0_49864110/article/details/127634890?ops_request_misc%257B%2522requ…

使用backdrop-filter实现elementui官网的模糊滤镜效果的和毛玻璃效果

前置 element-ui官网有一个属性很好看,可以看到,当滚动的时候,文字会被显示白色带阴影背景 你可能有点印象,因为公交车的时候也是类似于这种效果 他们是怎么做的呢?我看到源码使用到了 backdrop-filterbackground-sizebackground-image就实现了,很少的属性,达到了不错的效果,…

鲲鹏devkit训练营——《锁长期等待》项目解析

《锁长期等待》项目解析 通过本次实验学习掌握性能分析工具&#xff0c;利用性能分析工具找出程序中加锁范围不合理的地方并解决 安装web端性能分析工具 获取性能分析工具软件包 1、登录远程服务器 获取鲲鹏性能分析工具软件包上传到远端服务器 2、安装性能分析工具 使用…

【Flink】基本转换算子使用之fliter、flatMap,键控流转换算子和分布式转换算子

文章目录一 Flink DataStream API1 基本转换算子的使用&#xff08;1&#xff09;flitera 使用匿名类实现b 使用外部类函数实现b 使用flatMap实现&#xff08;2&#xff09;flatMapa 使用匿名类实现b 使用匿名函数实现2 键控流转换算子&#xff08;1&#xff09; keyBy&#xf…