导语
  接着上次的内容,上次博客中展示了原地进行单链表的逆序操作,当然除了原地逆序还可以通过递归的方式进行调用操作。下面就来看看通过递归的方式如何进行单链表的逆序操作。

递归法逆序链表

  假定原来的链表为1->2->3->5->4->7,递归的思路,首先就是将除了第一个节点以外的节点先进行逆序,然后将第一个节点添加到逆序的子链表后面。同理要逆序第二个节点,就需要将除了第一个节点以外的链表先进行逆序。通过这种方式就可以实现链表的完全逆序了。
第一次递归

第二次递归

  如上图所示,通过两次的操作,可以简单的理解递归思想在这里的使用,也就是要实现签名的结果必须到最后一次操作完成之后才会进行最终结果的返回。这个有一点需要注意的就是递归的层级。建议不要太深。
代码实现如下

public class Test{private static LNode RecursiveReverse(LNode head){//如果链表中只有一个元素或者链表为空if(head==null||head.next==null){return hread;}else{//先反转后面的节点LNode newhead = RecursiveReverse(head.next);// 把当前节点加到后续遍历节点的尾部head.next.next = head;head.next = null;return newhead;}}public static void Reverse(LNode head){if(head == null){return ;}//获取链表第一个结点LNode firstNode = head.next;//对链表进行逆序LNode newhead = RecursiveReverse(firstNode);//头结点指向逆序后链表的第一个结点head.next = newhead;}
}

算法性能分析

  由于递归也只需要对链表进行一次递归遍历,所以算法的时间复杂度为O(n)。算法的思路比较清晰,也就是说从第一个节点开始,这里所说的第一个节点就是链表的最后一个结点,倒数第二个节点,倒数第三个节点,以此类推。当然这里需要有一个数据栈的操作,所以说需要注意的就是方法栈的深度。从这个操作方面来看,算法在数据量大的情况下,数据栈深度太大会影响性能。

大厂面试算法系列-如何实现链表的逆序(二)-递归法相关推荐

  1. 大厂面试算法系列-如何实现链表的逆序(一)-原地逆序

    题目描述   给定一个带有头节点的单向列表,将这个链表进行逆序.例如head->1->3->4->2,逆序之后变成head->2->4->3->1 题目 ...

  2. 大厂面试算法系列-如何从无序链表中移除重复项(一)-顺序删除

    导语   题目描述:给定一个没有经过排序的链表,去掉其中的重复项,并且保留原顺序,例如链表1->2->1->5->5-7,去掉其中的重复项之后会变成 1->2->5 ...

  3. 大厂面试算法系列-如何从无序链表中移除重复项(二)-递归法

    导语   这种方法主要的思路是对节点cur来说首先递归的删除以cur.next为首的子链表中的重复节点.这个就是递归的主要思想.   对于节点cur,首先递归地删除以cur.next为首的子链表中重复 ...

  4. 单链表实现一元多项式相加_python面试系列 01如何实现单链表的逆序

    题目介绍 来源:腾讯笔试                         难度系数:★★★☆☆                  考察频率:★★★★☆ 题目描述: 给定一个带头结点的单链表,请将其逆序 ...

  5. 试写一算法,对单链表进行逆置

    NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...

  6. 如何实现链表的逆序?

    如何实现链表的逆序? 下面介绍了两种方法:1.就地逆序法 2.插入法 单链表数据结构 /*** @program: 算法与数据结构* @description: 单链表数据结构* @author: 粉 ...

  7. c 语言中双向链表逆转编程题,C/C++ 双链表之逆序的实例详解

    C/C++ 双链表之逆序的实例详解 一.结点结构 双向链表的数据结构定义如下: typedef struct node { ElemType data; struct node *prior stru ...

  8. c语言递归链表逆序,链表逆序的递归实现

    链表逆序是个很基础的算法,考察的是指针操作和基本数据结构.常规的写法当然是OK的,不过要是还会写出一个递归的链表逆序算法,那别人肯定要给你点个赞了. 1 问题描述 给定一个链表,请将其逆序.即如果链表 ...

  9. 将一个链表按逆序排列

    将一个链表按逆序排列,即将链头当链尾,链尾当链头. 源程序: #include <stdio.h> #include <malloc.h> #define LEN sizeof ...

最新文章

  1. Mysql是时候学习一个存储过程了
  2. php 云片网对接,php调用云片网接口发送短信的实现方法
  3. 应用服务器与WSGI协议以及flask后端框架总结(后端接收请求返回响应的整个流程)...
  4. 租房还是买房结婚?大数据告诉你年轻人的真实想法
  5. 并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并
  6. Python实现二叉树的非递归先序遍历
  7. SAP Spartacus 的 git flow 和发布流程
  8. 线段树初见——区间询问与改变最大值
  9. Ajax全接触(1)
  10. 如何让地面不起灰_什么是不发火地面,如何施工?
  11. 运行python manage.py runserver报错现象、原因和解决办法
  12. 苹果x和xs买哪个好_苹果12和苹果11哪个值得买-苹果12和11哪个更值得买
  13. vs2015 hiredis编译使用
  14. unity如何实现图片透视_如何用java实现图片与base64转换
  15. Inventor Pro v2008
  16. 迭代算法与递归算法的概念及区别
  17. Shiro 之 Subject 类
  18. web语意化的深入理解
  19. linux线程篇,linux线程篇 (二) 线程的基本操作
  20. 日活4亿的抖音,为何没能孵化出第二个拼多多?

热门文章

  1. python pptx怎么复制ppt_python pptx复制ppt中的某一页并且放在这一页之后
  2. Dom4j解析器_解析xml文档
  3. 用WM_COPYDATA消息来实现两个进程之间传递数据
  4. js如何实现动态显示表格数据(点奇数显示奇数单元格内容)
  5. 陈丽琳:如何以大数据助力商场运营
  6. Oracle关于时间/日期的操作
  7. 【笔记】2-SAT (tarjan)
  8. 【C++】 54_被遗弃的多重继承 (下)
  9. 自制简单表单验证relative与absolute定位
  10. .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控