使用递归实现链表反转

article/2025/9/23 13:23:11

链表反转(图解)


文章目录

  • 链表反转(图解)
  • 前言
  • 一、链表反转
  • 二、递归思想
  • 三、具体实现
    • 1.反转方法API
    • 2.具体实现代码
    • 3.方法测试
  • 四、方法调用过程
  • 总结


前言

链表反转是面试中的一个高频题目,可以通过多种方法实现,例如循环,递归;本篇文章将使用递归对链表实现反转。

一、链表反转

例如,给定一个单链表,原链表中的数据为: 1–>2–>3–>,反转后的链表为:4–>3–>2–>1。

二、递归思想

递归,有”递“还要有”归“,所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,否则会一直调用自己,造成死循环,从而栈内存溢出。也就是说,我们需要找出当方法的参数符合某一条件时,递归结束,之后把结果返回。使用递归反转其实就是从链表第一个存数据的节点开始,一次递归调用反转每一个节点,直到把最后一个节点反转完毕,整个链表就反转完毕。

三、具体实现

1.反转方法API

public void reverse():对整个链表反转
public void reverse(Node curr):反转链表中的某个节点,并把反转后的节点返回

2.具体实现代码

(链表的实现代码见另一篇文章:链式存储结构–单向链表的实现戳这儿

public void reverse(){if (isEmpty()){return;}reverse(head.next);}public Node reverse(Node curr){if (curr.next == null){//如果curr是最后一个节点,让头节点指向它head.next = curr;return curr;}//递归反转当前节点curr的下一个节点,返回值是链表反转后当前节点的上一个节点Node pre = reverse(curr.next);//让返回的下一个节点成为当前节点currpre.next = curr;//使节点原来的指向为空curr.next = null;return curr;}

3.方法测试

测试结果:
在这里插入图片描述

四、方法调用过程

main方法进栈
在这里插入图片描述

在main方法中调用reverse()方法,reverse()方法进栈。
在这里插入图片描述

reverse() 方法调用带重载的reverse(1) 方法。(此时reverse的参数curr=1,此处简写为reverse(1))reverse(1) 方法进栈,当方法执行到Node pre = reverse(2)时,调用带重载的reverse(2) 方法。
在这里插入图片描述

reverse(2) 方法进栈,当方法执行到Node pre = reverse(3)时,调用带重载的reverse(3) 方法
在这里插入图片描述

reverse(3) 方法进栈,当方法执行到Node pre = reverse(4)时,调用带重载的reverse(4) 方法。
在这里插入图片描述

reverse(4) 方法进栈, 当执行reverse(4) 方法时, 进行判断curr.next == null ,此时满足条件,使头结点指向 4 这个结点 ,然后,该方法将该节点返回给reverse(3).(reverse(4) 执行完毕出栈)
在这里插入图片描述
此时使head节点指向该curr节点,curr = 4;

接下来reverse(3) 接收 reverse(4) 的返回值,此时 当前pre 是4结点 ,执行剩余的代码;
pre.next = curr; 将 4 结点 的下一个结点指向 3 结点;
curr.next = null; 将 3 结点 的下一个结点指向 null (使3 结点原本指向指向4结点的指针断开)
reverse(3) 执行完毕后,将返回值(返回的是3结点)给 reverse(2) , 然后出栈。

在这里插入图片描述
紧接着 reverse(2) 接收 reverse(3) 的返回值 此时 当前pre 是3结点 ,执行剩余代码;
pre.next = curr; 将 3 结点 的下一个结点指向 2 结点;
curr.next = null; 将 2 结点 的下一个结点指向 null; (使2结点原本指向指向3结点的指针断开)
reverse(2) 执行完毕后,将返回值(返回的是2结点)给 reverse(1) , 然后出栈。

在这里插入图片描述
最后reverse(1) 接收 reverse(2) 的返回值 此时pre 是2结点 ,执行剩余的代码;
pre.next = curr; 将 2 结点 的下一个结点指向 1 结点;
curr.next = null; 将 1 结点 的下一个结点指向 null ;(使1结点原本指向指向2结点的指针断开)
reverse(1) 执行完毕后,将返回值(返回的是1结点)给 reverse() 方法(该方法没有使用变量接收返回值 ), 然后出栈

在这里插入图片描述
至此,程序执行完毕,使用递归反转单链表的功能已经实现。

方法调用内存图如下:
在这里插入图片描述

总结

综上,递归实现链表反转代码并不复杂,难度在于去理解这个递归调用的整个逻辑。


http://chatgpt.dhexx.cn/article/LyKsdfj9.shtml

相关文章

单向链表的反转(c++实现)

目录 前言单向链表的反转实现代码 总结更新 前言 本篇文章接着前文单链表的插入、删除(c实现)实现链表的反转,主要也即是在前文的基础上完成了一个InvertList()函数。 单向链表的反转 通过前面两篇文章的学习,已经对于链表的操…

C语言 单链表的反转

C语言 单链表的反转 一、简述 记--简单的将单链表的数据顺序进行反转。如将原来的顺序1 2 3 4 5 6 7 反转为:7 6 5 4 3 2 1 二、方式1:头插法 2.1 头插法1--类似新建链表 2.1.1 思路:断开链表头,然后以头插法的方式将原链表的数…

详解反转链表

LeetCode链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 情况一:头结点为空 情况二:链表只有一个节点 情况三:链表多于1个节点。 思路:让当前节点指向前一个节点。 如何才能做到当前…

详解链表反转问题

文章目录 链表反转问题详解前言一、整个链表反转1.栈2.头插法3.递归4.三指针法以上部分参考链接: 链接: [link](https://blog.csdn.net/Ezrealwj/article/details/119702058?ops_request_misc%257B%2522request%255Fid%2522%253A%2522166744018216782428679986%2522%252C%2522…

反转链表的四种方法

目录 1.第一种方法:原地反转。 2.第二种方法:利用头插法进行反转链表。 3. 第三种方法:利用迭代法进行反转链表。 4.第四种方法:利用递归法进行反转链表。 5.应用。 当我们学习链表之后,就要学习一些链表的操作&am…

反转链表-四种方法

反转链表 链接 题目:描述 给定一个单链表的头结点head,长度为n,反转该链表后,返回新链表的表头。 以上转换过程如下图所示: 示例1 输入: {1,2,3}返回值: {3,2,1}示例2 输入:…

链表反转的四种方法(栈、头插法、三指针法、递归法)

单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2->1; 下面来介绍链表反转的4种方法:(数据用1->2->3…

IntelliJ IDEA配置JDK

IntelliJ IDEA配置JDK JDK的配置环境变量不再赘述,直接进行IDEA的配置。 1、进入操作界面 file-->project Structure-->platform Settings-->SDKs,进行号操作 2、添加JDK的路径,点击apply按钮,进行ok按钮退出

如何在IDEA中配置不同的Java JDK?

Java的不同版本的JDK之间存在细微的差别,通常比较稳定的版本为JDK8、JDK11.由于在开发不同项目的过程中,我们可能需要在JDK间进行切换。 第一步,Java不同的JDK版本是可以兼容的(无需卸载之前的JDK),我们可…

jdk8 下载 安装 配置及idea配置jdk环境

jdk8 下载 安装与配置 一、下载二、安装三、环境配置四、测试jdk是否安装成功五、idea配置jdk环境 一、下载 下载地址: 链接:https://pan.baidu.com/s/1lkdSc7NmmLQirrLWQ9-Qmg 提取码:9802 二、安装 双击下载的应用程序——>下一步 更…

Intellij IDEA:统一配置JDK版本(JAVA 小虚竹)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成习惯 Intellij IDEA使用…

安装IDEA的教程以及配置JDK环境变量

安装IDEA的教程以及配置JDK环境变量 安装IDEA的教程配置JDK环境变量 安装IDEA的教程 1.右击ideaIU-2020.2.3.exe ,选择 以管理员身份运行 图1 安装第一步 2.点击Browser… 选择安装位置,然后点击next 图2 修改路径后点next 3.根据您的电脑系统位数选…

IDEA中JDK环境设置

IDEA中JDK环境设置 1 问题描述2 问题分析3 问题解决1 点击File,进入Project Structure2 选择Project, 设置项目jdk环境,如1.8. 再设置项目语言等级8.3 选择Modules模块, 选中当前模块,设置语言登录为8.4 最后从File中,进入Settings中,设置IDEA编译的jdk版本,且设置模块的编译版…

【2023最新】JDK安装 + IDEA配置一条龙

【2023最新】JDK安装IDEA配置一条龙 文章目录 【2023最新】JDK安装IDEA配置一条龙1. JDK81.1 JDK8下载1.2 JDK8安装1.3 JDK8环境变量配置1.4 JDK8测试安装 2. JDK172.1 JDK17下载2.2 JDK17安装2.3 JDK17配置2.4 Java8和Java17版本切换 3. IDEA3.1 IDEA下载3.2 IDEA安装配置3.3 …

IntelliJ IDEA安装与JDK 环境变量配置

IntelliJ IDEA是支持JAVA开发得一种IDE。 安装它需要下载后逐步安装,没什么难点,但是最后会需要一个注册码,网上找个几个都提示过期了,我先用免费30天吧。 然后需要安装JDK和配置环境变量。 一.下载JDK 1.去jdk官网地址&#…

idea如何配置jdk

提前安装jdk,配置环境变量 一、配置jdk 1、依次点开File -->Project Structure,点击左侧标签页,点击SDKs 2、点击号,选SDK 3、在弹出框选择jdk路径(我本地装了两个jdk,大家可以忽略) 4、点…

IntelliJ IDEA中配置JDK(SDK)

1、打开IDEDA,点击File,选择Project Structure。 2、首先,选择左侧栏目中的“SDK”,点击加号,选择我们所需要的“SDK”。—全局级配置 3、接着,选择“Project Setting”中的Project,在SDK处选…

idea和jdk安装与配置

idea和jdk安装与配置 1.下载idea和jdk(步骤待补充文字说明)2.安装idea3.打开idea4.被迫pojie idea5.新建项目6.创建文件7.校验Jdk配置(正确配置)校验(待校验)8.被迫安装jdk1.89.配置jdk1.8环境1.配置JAVA_HOME2.配置CLASSPATH3.配…

使用IntelliJ IDEA 配置JDK(入门)

一、JDK下载 首先要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 点击如下下载按钮: 在下载页面点击接受许可,并根据自己的系统选择对应的版本,本文以 Windo…

IDEA的安装及JDK环境配置(Java小白入门必备)

“明日之我,心中有丘壑,立马振山河” 前言: 今日给电脑重新装了下IDEA,并且配置了下环境,其中有些步骤我自己也忘记了,废了一番功夫弄好后在这里整理一下,以后可能也会有人不会怎么操作&#x…