(1)思想:和迭代反转法的思想恰好相反,递归反转法的实现思想是从链表的尾节点开始,依次向前遍历,遍历过程依次改变各节点的指向,即另其指向前一个节点。
(2)实现(建议先看代码,再看图解,使理解更加深刻):

开始递归:

new_head经过三次函数递归的调用来到了链表的最后一个结点,因为new_head=head->next,所以head始终保持在new_head的前一个结点处。

递归到最后一层时:

开始逐层出递归:

递归结束。

最后的结果为:

代码片段:


link* recursive_reverse(link* head) {//出递归条件 if (head == NULL || head->next == NULL)    {return head;}else{//new_head一直找到链表中的最后一个元素的地址 link *new_head = recursive_reverse(head->next);//出递归后,将链表 head->next->next = head;head->next = NULL;return new_head;}
}

完整代码:

#include<stdio.h>
#include<stdlib.h>typedef struct Link{int elem;struct Link* next;
}link;link* initLink(){int i; //定义头指针 link* head=NULL;//定义首元结点link* temp=(link*)malloc(sizeof(link));//首元结点初始化temp->elem=1;temp->next=NULL;head=temp;//创建其他结点for(i=2;i<5;i++){link* a=(link*)malloc(sizeof(link));a->elem=i;a->next=NULL;temp->next=a;temp=temp->next; } //返回头指针的地址 return head;
}void printLink(link* head){link* p=head;while(p){printf("%d ",p->elem);p=p->next;}printf("\n");
}link* recursive_reverse(link* head) {//出递归条件 if (head == NULL || head->next == NULL)    {return head;}else{//new_head一直找到链表中的最后一个元素的地址 link *new_head = recursive_reverse(head->next);//出递归后,将链表 head->next->next = head;head->next = NULL;return new_head;}
}int main()
{link*p=initLink();printf("原始链表:");printLink(p);printf("反转链表:");p=recursive_reverse(p); printLink(p);return 0;
} 

输出结果:

反转链表-递归反转法相关推荐

  1. 反转链表-头插反转法

    (1)思想:是指在原有链表的基础上,依次将位于链表头部的节点摘下,然后采用从头部插入的方式生成一个新链表,则此链表即为原链表的反转版. (2)实现(如下图): 一开始创建一个新的头结点,然后在创建一个 ...

  2. [剑指offer][JAVA]面试题第[24]题[反转链表][递归][双指针][头插法]

    [问题描述][中等] 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4 ...

  3. 递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分

    读完本文,你可以去力扣拿下如下题目: 92.反转链表II ----------- 反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是 ...

  4. 递归反转链表的一部分

    递归反转链表的一部分 反转单链表的迭代实现不是⼀个困难的事情, 但是递归实现就有点难度了,如果再加⼀点难度, 让你仅仅反转单链表中的⼀部分, 你是否能够递归实现呢? 本⽂就来由浅⼊深, 逐步地解决这个 ...

  5. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

  6. 剑指Offer - 面试题24. 反转链表(遍历/递归)

    1. 题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4-&g ...

  7. 剑指Offer - 面试题6. 从尾到头打印链表(栈,递归,反转链表)

    文章目录 1. 题目 2. 解题 2.1 stack解题 2.2 递归 2.3 反转链表 1. 题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head ...

  8. 反转链表 python 递归_LeetCode 206.反转链表(Python3)

    题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你 ...

  9. 递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度

    递归反转链表改变原链表吗 Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose add ...

  10. 翻转链表python递归_Python LeetCode-206.反转链表(难度-简单) 两个方法-迭代和递归,以及超简写法(python)...

    1.题目描述 反转一个单链表. 实例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: ...

最新文章

  1. python填写excel-Python|读、写Excel文件(三种模块三种方式)
  2. OSChina 周五乱弹 —— 静静的思考下人生
  3. nginx源码初读(8)--让烦恼从数据结构开始(ngx_event)
  4. centos下利用httpd搭建http服务器方法
  5. wp7设置浏览器主页
  6. Spring框架学习笔记04:初探Spring——采用Java配置类管理Bean
  7. 7832:最接近的分数
  8. keytool 使用
  9. softmax 激活函数
  10. Unity 模拟鼠标点击
  11. 计算机管理里找不到固态硬盘,教大家电脑插上固态硬盘提示找不到设备怎么办...
  12. R语言_根据马科维茨投资组合理论画出最优投资组合线
  13. 学了C语言想装x能干点啥?手把手教你写个聊天软件来玩玩
  14. 常见机器学习优点和缺点
  15. Xcode9中,添加图片素材无法显示的问题
  16. EPICS简单实例2 -- subroutine记录(sub)介绍与使用
  17. 爬虫路线Requests-Re-BeautifulSoup技术路线总结
  18. 跨境电商的痛点有哪些?
  19. redis如何清空缓存
  20. 智能仓储硬核资料分享

热门文章

  1. 计算机病毒 爱虫病毒(lovebug),有哪些是典型计算机病毒
  2. zblog自动采集伪原创发布
  3. CHKRecovery(文件删除还原工具)v3.3.0绿色版
  4. c语言调用函数时二维数组实参,C语言函数调用二维数组,指针问题
  5. springboot xml转json工具类
  6. 原生html5时间组件,amazeui时间组件的实现示例
  7. SlideLive:提供时间线类型PPT模板下载
  8. mapgis k9将wp、wl、wt转shp属性字段名乱码
  9. xmapp 终端数据库问题记录 已解决
  10. TeamViewer跟向日葵远程控制软件有什么区别?