采用递归逆序打印单链表(递归出口的三种写法)

来源:互联网 发布: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
原创粉丝点击