广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么理解Java递归单链表反转
  • 676
分享到

怎么理解Java递归单链表反转

2024-04-02 19:04:59 676人浏览 八月长安
摘要

这篇文章主要讲解了“怎么理解Java递归单链表反转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java递归单链表反转”吧!首先,咱们要先明确,什么

这篇文章主要讲解了“怎么理解Java递归链表反转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java递归单链表反转”吧!

首先,咱们要先明确,什么是递归。递归就是自己调用自己对吧。比如:有一个函数为 f(n) = f(n-1) * n  ,(注意,我这里是举例子,这个函数没有给出递归的结束条件)给 n 赋值为 5 , 则:

--> f(5) --> 5 * f(4) --> 5 * ( 4 * f(3)) --> 5 * ( 4 * (3 * f(2))) --> 5 * ( 4 * ( 3 * ( 2 * f (1)))) --> 5 * ( 4 * ( 3 * ( 2 * 1))) --> 5 * ( 4 * ( 3 * 2)) --> 5 * ( 4 * 6 ) --> 5 * 24 --> 120

在看完例子之后,咱们接下来不 BB ,直接 show code:

 public class ReverseSingleList {     public static class node{         private int data;         private Node next;          public Node( int data , Node next){             this.data = data;             this.next = next;         }          public int getData(){return  data;}     }     public static void main(String[] args){         // 初始化单链表         Node node5 = new Node(5,null);         Node node4 = new Node(4,node5);         Node node3 = new Node(3,node4);         Node node2 = new Node(2,node3);         Node node1 = new Node(1,node2);          // 调用反转方法         Node recursiveList = recursiveList(node1);         System.out.println(recursiveList);     }          public static Node recursiveList(Node list){         // 如果链表为空 或者 链表中只有一个节点,直接返回         // 也是递归结束的条件         if (list == null || list.next == null) return list;         Node recursive = recursiveList(list.next);         // 将 list.next.next 指针指向当前链表 list         list.next.next = list ;         // 将 list.next 指针指向 null         list.next = null;         // 返回反转之后的链表 recursive         return recursive;     } }

经过上面的代码,应该能够看到核心代码就是,递归实现单链表反转部分的那 5 行代码,别小看了这 5 行代码,想要真正弄清楚还真的挺不容易的。

我把这 5 行代码贴在这里,咱们一行行分析,争取看完这篇博客就能懂~(注释我就去掉了,咱们专心看这几行核心代码)

if (list == null || list.next == null) return list; Node recursive = recursiveList(list.next); list.next.next = list ; list.next = null; return recursive;

第一行就是一个判断,条件不满足,那就往下走,第二行是自己调用自己,程序又回到第一行,不满足条件程序向下执行,自己调用自己

就这样循环到符合条件为止,那么什么时候符合条件呢?也就是 list == null 或者 list.next == null 时,看一下自己定义的链表是  1->2->3->4->5->null ,所以符合条件时,此时的链表为 5->null  ,符合条件之后,程序继续向下执行,在执行完 Node recursive = recursiveList(list.next);  这行代码之后,咱们来看一下此时的程序执行结果:

怎么理解Java递归单链表反转

我把上面这个给画出来(阿粉的画工不是不好,不要在乎它的美丑~)

怎么理解Java递归单链表反转

接下来程序该执行 list.next.next = list 执行结束之后,链表大概就是这个样子:

怎么理解Java递归单链表反转

那是图,下面是程序断点调试程序的结果,发现和上面的图是一样的:

怎么理解Java递归单链表反转

程序继续向下走 list.next = null ,也就是说,将 list 的 next 指针指向 null :

怎么理解Java递归单链表反转

从图中看到, list 为 4->null , recursive 为 5->4->null  ,咱们来看看程序的结果,是不是和图相符:

怎么理解Java递归单链表反转

完全一样有没有!

OK ,还记得咱们刚开始的递归函数例子嘛?现在执行完毕,开始执行下一次,咱们继续来看,此时的链表是这个样子的:

怎么理解Java递归单链表反转

接下来程序执行的代码就是四行了:

Node recursive = recursiveList(list.next); list.next.next = list ; list.next = null; return recursive;

继续执行程序,咱们来看结果,将 list.next.next = list 运行结束时,此时链表为:

怎么理解Java递归单链表反转

从图中能够看到,链表 list 为 3->4->3->4 循环中, recursive 为  5->4->3->4->3 循环,咱们看一下程序是不是也是如此(在这里我截了两个循环作为示例):

怎么理解Java递归单链表反转

接下来程序执行 list.next = null ,执行完毕之后,就是将 list 的 next 指针指向 null :

怎么理解Java递归单链表反转

从图中能够看出来, list 为 3->null , recursive 为 5->4->3->null  ,上图看看实际结果和分析的是否一致:

怎么理解Java递归单链表反转

说明什么?!说明咱们上面的分析是正确的。接下来的程序分析,读者们就自行研究吧,相信接下来的分析就难不倒咱们聪明的读者啦~

反转单链表的前 N 个节点

OK ,咱们趁热打铁一下,刚刚是通过递归实现了整个单链表反转,那如果我只是想反转前 N 个节点呢?

比如单链表为 1->2->3->4->5->null ,现在我只想反转前三个节点,变为  3->2->1->4->5->null

有没有想法?

咱们进行整个单链表反转时,可以理解为传递了一个参数 n ,这个 n  就是单链表的长度,然后递归程序不断调用自己,然后实现了整个单链表反转。那么,如果我想要反转前 N 个节点,是不是传递一个参数 n 来解决就好了?

咱们就直接上代码了:

   public static Node next;   public static Node reverseListN(Node list,int n){       if (n == 1) {           // 要进行反转链表时,先将 list 后的节点数据保存到 next 中           next = list.next;           return  list;       }        Node reverse = reverseListN(list.next , n-1);       list.next.next = list;       // 将 list.next 的指针指向没有进行反转的链表       list.next = next ;       return reverse;   }

反转单链表的一部分

既然反转整个单链表实现了,反转前 N 个节点实现了,那么如果有个需求是反转其中的一部分数据呢?大概就是这样,原来的链表为  1->2->3->4->5->null ,反转其中的一部分,使反转后的链表为  1->4->3->2->5->null

借用反转前 N 个节点的思路,是不是我传两个参数进来,一个是开始反转的节点,一个是结束反转的节点,然后递归操作就可以了?

瞅瞅代码是怎么写的:

 public static Node reverseBetween(Node list , int m , int n){     if (m == 1){         return reverseListN(list,n);     }     list.next = reverseBetween(list.next,m-1,n-1);     return list; }

感谢各位的阅读,以上就是“怎么理解Java递归单链表反转”的内容了,经过本文的学习后,相信大家对怎么理解Java递归单链表反转这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么理解Java递归单链表反转

本文链接: https://www.lsjlt.com/news/85157.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解Java递归单链表反转
    这篇文章主要讲解了“怎么理解Java递归单链表反转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java递归单链表反转”吧!首先,咱们要先明确,什么...
    99+
    2022-10-19
  • 聊聊golang怎么用递归实现反转链表
    在golang中,反转链表可以使用递归来实现。在递归函数中,我们首先需要将当前节点的下一个节点作为参数传入递归函数,然后让当前节点指向下一个节点的下一个节点。最后返回递归函数的返回值,即新的头节点。以下是使用递归实现反转链表的golang代...
    99+
    2023-05-14
  • 怎么使用PHP递归实现链表的反转操作
    本文小编为大家详细介绍“怎么使用PHP递归实现链表的反转操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用PHP递归实现链表的反转操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现方法在递归反转链表...
    99+
    2023-07-05
  • java怎么实现单链表反转
    要实现单链表的反转,可以使用迭代或递归两种方法。 迭代法: public ListNode reverseList(ListNo...
    99+
    2023-10-26
    java
  • web数组与链表到单链表的反转怎么理解
    本篇内容主要讲解“web数组与链表到单链表的反转怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web数组与链表到单链表的反转怎么理解”吧!数组与链表数组最大的一个特点就是,需要一块连续的...
    99+
    2023-06-16
  • 怎么用python递归实现链表快速倒转
    这篇文章主要介绍“怎么用python递归实现链表快速倒转”,在日常操作中,相信很多人在怎么用python递归实现链表快速倒转问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用python递归实现链表快速倒转...
    99+
    2023-06-30
  • Java反转链表怎么测试
    本篇内容主要讲解“Java反转链表怎么测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反转链表怎么测试”吧!链表特点便于增删数据,不便于寻址在内存中属于跳转结构单链表和双链表的定义单链...
    99+
    2023-07-06
  • python怎么实现单向链表及单向链表的反转
    这篇文章给大家分享的是有关python怎么实现单向链表及单向链表的反转的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。链表的定义链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息...
    99+
    2023-06-14
  • c语言单链表反转代码怎么写
    以下是一个简单的C语言单链表反转代码示例: #include #include // 定义链表节点结构体 typedef st...
    99+
    2023-10-26
    c语言
  • Python怎么实现单链表中元素的反转
    这篇文章主要介绍了Python怎么实现单链表中元素的反转的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现单链表中元素的反转文章都会有所收获,下面我们一起来看看吧。给定一个单链表,将其反转。其实...
    99+
    2023-06-30
  • Java​逆转单向链表怎么实现
    这篇文章主要讲解了“Java逆转单向链表怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java逆转单向链表怎么实现”吧!首先这是一个单向的链表,不同于 Java 里面的 Linked...
    99+
    2023-06-04
  • 利用Java怎么实现一个反转链表
    今天就跟大家聊聊有关利用Java怎么实现一个反转链表,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。链表结点如...
    99+
    2023-05-31
    java ava
  • java项目中怎么将数据结构转换为单链表
    java项目中怎么将数据结构转换为单链表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。   单链表实现链表的打印及元素删除操作,链表的实现主要是next...
    99+
    2023-05-31
    java 数据结构 单链表
  • java单链表怎么实现书籍管理系统
    这篇文章主要介绍“java单链表怎么实现书籍管理系统”,在日常操作中,相信很多人在java单链表怎么实现书籍管理系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java单链表怎么实现书籍管理系统”的疑惑有所...
    99+
    2023-06-25
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作