采用递归逆序打印单链表(递归出口的三种写法)
来源:互联网 发布:mac os 10.9 安装u盘 编辑:程序博客网 时间:2024/05/29 19:30
// recursePrintList.cpp : 定义控制台应用程序的入口点。// 递归逆序打印链表(递归出口的三种写法)#include "stdafx.h"#include <iostream>using namespace std;struct node{ int value; node* next;};node* createList();void printList(node* head);void reversePrint(node* ptr);void reversePrint1(node* ptr);void reversePrint2(node* ptr);int _tmain(int argc, _TCHAR* argv[]){ // 创建链表 node* head = createList(); printList(head); // 递归反转链表 cout<<endl; reversePrint(head->next); //reversePrint1(head->next); //reversePrint2(head->next); system("pause"); return 0;}// 创建链表node* createList(){ node* head = new node(); head->value = -1; head->next = NULL; for(int i=0;i<100;i++){ node* newnode = new node(); newnode->value = i; // 头插 newnode->next = head->next; head->next = newnode; } return head;}void printList(node* head){ node* ptr = head->next; while(ptr!=NULL){ cout<<ptr->value<<" "; ptr = ptr->next; }}// 递归出口写法1void reversePrint(node* ptr){ if(ptr!=NULL){ // 能递归调用的条件,不满足条件就啥也不做(递归出口) reversePrint(ptr->next); cout<<ptr->value<<" " ; }}// 递归出口写法2// return表示程序中断,return后面的代码都不会执行// 慎用return,在二叉树的递归中,如果左子树到达出口return了,但此时右子树可能未到达出口,直接return会导致后面右子树的代码不能执行void reversePrint1(node* ptr){ if(ptr==NULL){ return; } reversePrint(ptr->next); cout<<ptr->value<<" " ;}// 递归出口写法3// 到达递归出口就啥也不做,因为递归函数本身没有返回值void reversePrint2(node* ptr){ if(ptr==NULL){ // 这里不需要return,啥也不做就行 }else{ reversePrint(ptr->next); cout<<ptr->value<<" " ; }}
return一般用在程序的第一句对参数校验是否合格,如果不合格就直接返回,下面的代码就不用执行了。
第一种和第三种写法是推荐的,第二种写法很多情况下会出问题,因为在函数递归调用过程中错误的return会导致后面的代码不能执行。
对于这种没有返回值的递归调用,可以在函数体中只指明递归调用的条件,像第一种写法,其他不能递归调用的情况就不用管了,不符合这个条件时递归自然就到达了出口处,此时程序就会啥也不做,程序自然就结束了。快速排序的主函数中就是这样写的。
同样也可以采用第三种写法,因为没有返回值,到达递归出口时啥也不做就行了。
注意以上讨论的情况只适用于没有返回值的情况。
0 0
- 采用递归逆序打印单链表(递归出口的三种写法)
- 递归逆序打印单链表(c实现)
- 逆序输出字符串采用递归的方式
- 递归逆序打印字符串
- 逆序打印数组-递归
- 单链表逆序(递归&非递归)
- 单链表逆序(递归&非递归)
- 在VS和Linux下逆序打印单链表(递归和非递归)
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- 递归实现字符串逆序打印
- 合并排序的三种不同写法,包括递归和非递归
- Python 使用递归打印输出数字 (逆序和顺序)
- C++单链表递归逆序
- 单链表逆序的递归与非递归算法
- 单链表逆序的递归与非递归算法
- 单链表的逆序实现,递归和非递归算法
- 逆序单链表的递归和非递归实现
- 单链表逆序的递归与非递归算法
- winform的DataGridView中捕捉CheckBox ( DataGridViewCheckBoxCell ) 列的状态改变
- Linux服务器IP修改后,Oracle应用需要修改的文件记录
- Git Hooks实现开发部署任务自动化
- AndroidUtils——DensityUtils
- 升级gcc
- 采用递归逆序打印单链表(递归出口的三种写法)
- 【UNITY多语言化问题】NGUI的多语言本地化Localization到底能不能使用
- RN----导入组件,import from 'xxxx'的用法详解
- 双端队列
- MyEclipse中怎么快速生成get和set函数
- 测试驱动开发心得体会
- (转)一些你需要知道的布局优化技巧
- mysql学习笔记之管理维护(三)
- 解方程 NOIP2014 提高组 Day2 T3