对递归的一些理解。力扣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); // 递归地处理下一个节点  }  
}

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

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

相关文章

顶级电子合同平台推荐:2024年精选

本文将介绍以下10款工具:e签宝、法大大、上上签、金格签约、契约锁、DocuSign、Concord、PandaDoc、Agiloft、Evisort。 在当今数字化时代,选择一个合适的电子合同平台可能会让人感到困惑,如何判断哪个平台最适合企业的需求?电子合…

Linux 必备基础知识与常用命令大汇总

这是我整理的关于Linux基础知识的笔记,主要为了方便在长期不用Linux的情况下,突然需要使用时可以快速查找。我最初有些犹豫是否应该写成文章,但我认为对于处于相似境遇的人来说,能够方便地复制和使用这些知识会很有帮助&#xff0…

SpringCloud:使用OpenFeign优化前面的Nacos实现高效购物车商品信息处理

在现代电商系统中,购物车的性能直接影响用户的购物体验。为了提升系统性能和用户满意度,我们可以使用Spring Cloud的OpenFeign和负载均衡器来高效地处理购物车中的商品信息。本文将详细介绍如何在Spring Cloud中集成这些组件,并实现一个高效的…

【汽车】常见缩略语说明

缩略语英文名称中文名称3GPP3rd Generation Partnership Project第三代合作伙伴计划5GAA5G Automotive Association5g汽车协会APPApplication应用ADASAdvanced Driver Assistant Systems高级驾驶辅助系统CaaSCarasaService汽车即服务CANController Area Network控制器局域网络C…

Java之数组应用-选择排序-插入排序

已经完全掌握了冒泡排序和二分查找的同学,可以自己尝试学习选择、插入排序。不要求今天全部掌握,最近2-3天掌握即可! 1 选择排序 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次…

Mysql备份恢复

目录 1.Mysql日志管理 1.1为什么需要日志 1.2日志作用 1.3数据丢失或破坏的原因 1.4常见日志类型之错误日志 1.5常见日志类型之通用查询日志 1.6常见日志类型之慢查询日志 1.7常见日志类型之二进制日志 1.8常见日志类型之事务日志 2.MySQL备份 2.1备份类型 2.2逻辑…

超低功耗ARM Cortex-M33 TZ MCU STM32WBA54、STM32WBA55:通过提升无线性能实现更出色的用户体验

摘要 STM32WBA54、STM32WBA55产品系列同时支持多种无线标准,包括Bluetooth低功耗 5.4(已认证)、Zigbee、Thread以及可用作Thread边界路由器的Matter。 该产品系列具有出色的灵活性和更强的安全性,可帮助开发人员应对不断变化的无…

新能源汽车的充电网络安全威胁和防护措施

1. 物理攻击:例如恶意破坏、搬走充电设施等,这可能会对充电设施造成损害,妨碍正常的电力传输。 2. 网络攻击: 黑客可能利用系统漏洞攻击网络,破坏设备,并窃取用户的个人信息、支付信息等; 车辆…

24暑假算法刷题 | Day21 | LeetCode 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

目录 669. 修剪二叉搜索树题目描述题解 108. 将有序数组转换为二叉搜索树题目描述题解 538. 把二叉搜索树转换为累加树题目描述题解 669. 修剪二叉搜索树 点此跳转题目链接 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪…

企业邮件系统管理(二)配置与优化指南

文章目录 企业邮件系统管理:配置与优化指南引言第一部分:了解邮件系统的基础架构一、MTA与MUA的定义及作用二、常见的邮件协议 第二部分:Exchange Server 2010的核心功能一、Exchange Server的服务器角色二、“典型安装”包含的服务器角色三、…

packet_write_wait: Connection to <IP> port <PORT>: Broken pipe

packet_write_wait: Connection to <IP> port <PORT>: Broken pipe 是一个常见的网络错误&#xff0c;指的是尝试向一个已经损坏的 TCP 连接写入数据。下面是这个错误的一些可能原因和解决方法&#xff1a; 可能的原因&#xff1a; 客户端断开连接&#xff1a; 远…

vite环境下使用bootstrap

环境 nodejs 18 pnpm 初始化 pnpm init pnpm add -D vite --registry http://registry.npm.taobao.org pnpm add bootstrap popperjs/core --registry http://registry.npm.taobao.org pnpm add -D sass --registry http://registry.npm.taobao.org新建vite.config.js cons…

【git】如何实现规范git commit -m的格式

.husky/commit-msg #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"yarn commitlint --edit $1.vscode/settings.json "ahooks","aliyuncs","antd","commitlint", // 新增"deadcode","deno…

用三行代码“偷袭白嫖党”,保护自己的代码(多语言实现)

计算机科学专业的同学们最近遇到了一件烦心事。教授布置了一系列具有挑战性的编程作业&#xff0c;需要大家运用所学知识来完成。然而&#xff0c;一些同学却动起了歪脑筋&#xff0c;想要通过抄袭他人的代码来轻松完成任务。 小李、小王和小张是同宿舍的好友&#xff0c;他们…

第1课:计算机历史与基础——一段跨越时代的技术演进

目录 引言计算机的起源机械计算时代 电子计算机的曙光个人计算机的革命现代计算机的多样化计算机的分类计算机的特点计算机技术的未来发展结语 引言 在数字化浪潮的推动下&#xff0c;计算机已经成为现代社会的中枢神经。它们不仅驱动着我们的工作流程&#xff0c;更深入地影响…

四、GD32 MCU 常见外设介绍(1)RCU 时钟介绍

系统架构 1.RCU 时钟介绍 众所周知&#xff0c;时钟是MCU能正常运行的基本条件&#xff0c;就好比心跳或脉搏&#xff0c;为所有的工作单元提供时间 基数。时钟控制单元提供了一系列频率的时钟功能&#xff0c;包括多个内部RC振荡器时钟(IRC)、一个外部 高速晶体振荡器时钟(H…

【力扣习题】C语言

目录 【876.链表的中间点】 思路&#xff1a; 【83删除排序链表中的重复元素】 思想&#xff1a; 代码&#xff1a; 【876.链表的中间点】 思路&#xff1a; 1、计算链表的长度 2、遍历到链表中间长度并输出值 /*** Definition for singly-linked list.* struct ListN…

如何提升短视频的曝光量和获客效能?云微客来解决

在流量至上的当下&#xff0c;短视频凭借其优势&#xff0c;迅速成为了众多企业获客引流的核心营销手段。进入短视频赛道后&#xff0c;如何提升短视频的曝光量和获客效能&#xff0c;就成为了众多企业亟待解决的焦点。 如果你不想投入大量的广告预算&#xff0c;还想在短视频平…

【GoF23种设计模式+简单工厂模式】

一、设计模式概述与类型 1.1、设计模式的一般定义&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码&#xff0c;让代码更容易被他人理解并且保证代…

【Linux】进程间通信及管道详细介绍(上)

前言 本节我们开始学习进程间通信相关的知识&#xff0c;并详细探讨一下管道&#xff0c;学习匿名管道和命名管道的原理和代码实现等相关操作… 目录 1. 进程间通信背景1.1 进程通信的目的&#xff1a; 2 管道的引入&#xff1a;2.1 匿名管道&#xff1a;2.1.1 匿名管道的原理&…