从尾到头打印单链表 (递归)

//链表结点的定义
typedef struct Lnode {
    int data;
    struct Lnode *next;
}Lnode,*LinkList;
void reverse(LinkList &L)
{
    if (L->next != nullptr) {
        reverse(L->next);
    }
    printf("%d", L->data);

 

一开始一直理解不了 

拆开来看其实很简单

把 L->next = nullptr 作为递归出口

在 L->next = nullptr 之前 会一直做 reverse(L->next);

假设做到了最后一步 那么肯定是打印链表最后一个结点的值 此时是 printf("%d", L->next->next->data)

                                     n-1个next

这样获得了递归终点的值 往回推就可以了 

那么就将倒数第二个 if...........reverse(L->next);       换成 printf("%d", L->next->next->data)

                                              n-2个next

再将倒数第三个 if...........reverse(L->next); 换成............

以此类推

这样一直往下 因为递归是栈的形式 后进先出 因此 最后的那个printf在最上面

就成了

printf("%d", L->next->next->next->next->data);

printf("%d", L->next->next->next->data);

printf("%d", L->next->next->data);

printf("%d", L->next->data);

printf("%d", L->data);

 

实现链表的从后往前打印

图画一下大概是

 

 

函数开始执行 


L->next != nullptr      打印输出 → 结束
↓                              ↑
L->next != nullptr      打印输出
↓                               ↑
L->next != nullptr           打印输出
↓                               ↑
L->next == nullptr     →     打印输出            

可以看出最后的反而最先打印

posted on 2018-05-17 12:40  晴未  阅读(309)  评论(0编辑  收藏  举报