源 http://blog.youkuaiyun.com/nevasun/article/details/7701942
通常实现某种算法有两种常用的思想:循环和递归,这两种方式都需要占用一定的空间,但是循环使用的是某一个栈帧的空间,而递归则会使运行时函数调用不断压栈导致栈帧数量的增加。我在之前的动态规划算法学习中提到的爬楼梯问题所采用的两种方式可以很好地解释这两种思想。
在《编程之美》3.4扩展问题实现中,使用循环的思想实现了链表的逆序,这种方式需要使用三个临时变量。那如何只使用一个临时变量实现单链表逆置呢?我们可以采用栈,将链表节点保存在栈结构中,但是这样也不符合只是用一个临时变量的要求。对比循环和递归的特点,对于变量个数要求的问题,递归可以很好地解决。
- typedef struct Node
- {
- int data;
- struct Node *pnext;
- }Node;
- Node *head; /* head是逆序后的头结点 */
- Node *reverse(Node *p)
- {
- if(p == NULL || p->pnext == NULL)
- {
- head = p;
- return head;
- }
- reverse(p->pnext)->pnext = p;
- p->pnext = NULL;
- return p;
- }