当前位置: 首页 > news >正文

对递归的一些理解。力扣206题:翻转链表

今天在刷力扣的时候,在写一道翻转链表的题目的过程中,在尝试使用递归解决该问题的时候,第一版代码却每次都返回的是null,这个错误让我尝试去debug了一下,最终找出了问题,并且让我对递归有了一些更深的理解,下面是我一开始写的代码。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {  public ListNode reverseList(ListNode head) {  ListNode pre = null;  ListNode cur = head;  reverse(pre, cur);  return pre;  }  public void reverse(ListNode pre, ListNode cur) {  if (cur == null) {  // 递归基,当cur为空时,表示已到达链表末尾,直接返回  return;  }  ListNode next = cur.next; // 保存当前节点的下一个节点  cur.next = pre; // 反转当前节点的指向  reverse(cur, next); // 递归地处理下一个节点  }  
}

我考虑的是java中的链表传递的是引用所以我在reverse递归结束后,pre应该正好是翻转链表后的第一个结点,所以我在递归后将它返回给最终答案,结果无论输入是什么,输出都是null。

在debug后,我发现,

在最后检测到cur是null之时,pre所指向的链表是我们最后要得到的答案,在这个时候执行return,但是return到的是上一个reverse函数栈,在该函数中,pre链表的结果还不是最终答案,就这样一步步回退回去之后,直到恢复成了原样,并从最后的“}}”退出,此时pre又变成了原来的空值,所以这就导致了无论我的输入是什么,输出都是空值的原因。 

将代码修改如下,在最后找到目标答案值得时候,一层层返回这个答案值,而不是返回空值得回退,这样可以将最后得答案值返回给进入循环时的pre,修改后的代码如下所示。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {  public ListNode reverseList(ListNode head) {  ListNode pre = null;  ListNode cur = head;  return reverse(pre, cur); }  public ListNode reverse(ListNode pre, ListNode cur) {  if (cur == null) {  // 递归基,当cur为空时,表示已到达链表末尾,直接返回  return pre;  }  ListNode next = cur.next; // 保存当前节点的下一个节点  cur.next = pre; // 反转当前节点的指向  return reverse(cur, next); // 递归地处理下一个节点  }  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 细说网络安全五家龙头企业,你去过哪一家?
  • SkyWalking入门搭建【apache-skywalking-apm-10.0.0】
  • 二、QGroundControl开发环境搭建
  • Linux下如何安装配置Zsh Shell
  • 鸿蒙之Grid实现拖动自定义排序特效
  • 决策树(Decision Tree)
  • 培训第十三天(DNS逆向解析与主从服务、ntp时间服务器)
  • 【接口自动化_08课_Pytest+Yaml+Allure框架】
  • 从统计学、到机器学习和ChatGPT
  • 数据结构第三讲:单链表的实现
  • GitLab添加TortoiseGIT生成SSH Key
  • Java 中如何执行命令行方法
  • 初识godot游戏引擎并安装
  • JAVA基础知识4(static、继承)
  • Spring中存储Bean的相关注解及用法
  • 深入了解以太坊
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • axios 和 cookie 的那些事
  • ES6 学习笔记(一)let,const和解构赋值
  • IDEA 插件开发入门教程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java小心机(3)| 浅析finalize()
  • Laravel Telescope:优雅的应用调试工具
  • node 版本过低
  • opencv python Meanshift 和 Camshift
  • python3 使用 asyncio 代替线程
  • SpringCloud集成分布式事务LCN (一)
  • vue:响应原理
  • 闭包--闭包之tab栏切换(四)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 微信小程序开发问题汇总
  • 新书推荐|Windows黑客编程技术详解
  • 延迟脚本的方式
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 整理一些计算机基础知识!
  • ​Java基础复习笔记 第16章:网络编程
  • # Apache SeaTunnel 究竟是什么?
  • #include到底该写在哪
  • $.ajax()参数及用法
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (回溯) LeetCode 131. 分割回文串
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十六)Flask之蓝图
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET6实现破解Modbus poll点表配置文件
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解