题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
分析:可以用栈和递归两种方式,但递归方式只只适用于链表节点数少的情况,如果节点数多会造成栈溢出。
#include <stdio.h>
#include <malloc.h>
#include <stack>
using namespace std;
typedef struct node
{
int value;
struct node *next;
}node,*pnode;
void create(pnode *head)//创建单链表
{
pnode p,q;
int i;
for(i=1;i<10;i++)
{
p = (pnode)malloc(sizeof(node));
if(!p)
{
printf("创建空间失败!\n");
return;
}
p->value = i;
p->next = NULL;
if(i==1)
{
*head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
printf("创建节点为:\n");
p = *head;
while(p != NULL)
{
printf("%d\t",p->value);
p = p->next;
}
printf("\n");
}
void print_reverse(pnode *head)//递归
{
if(*head == NULL)
return;
pnode p = *head;
print_reverse(&p->next);
printf("%d\t",p->value);
}
void print_stack(pnode *head)//栈
{
if(*head == NULL)
return;
pnode p =*head;
stack<pnode> nodes;
while(p!=NULL)
{
nodes.push(p);
p = p->next;
}
while(!nodes.empty())
{
p = nodes.top();
printf("%d\t",p->value);
nodes.pop();
}
}
void delete_node(pnode *head)
{
pnode p = *head,q;
while(p!=NULL)
{
q = p->next;
free(p);
p = q;
}
p = NULL;
q = NULL;
}
int main()
{
pnode head = NULL;
create(&head);
printf("从尾到头打印链表(递归):\n");
print_reverse(&head);
printf("\n");
printf("从尾到头打印链表(栈):\n");
print_stack(&head);
printf("\n");
delete_node(&head);
return 0;
}