//链表结点的定义 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 → 打印输出
可以看出最后的反而最先打印