1.问题描述
输入一个链表的头结点,从尾到头反过来打印出每个结点的值。(来自《剑指offer》)
2.分析
通常遍历一个链表都是从头开始遍历的,现在让我们从尾到头打印结点的值,我们可以使用栈这种数据结构(因为先进后出)来存储链表,然后在弹出栈中的元素,从而从尾到头打印出结点的值。 另外 递归在本质上就是一个栈结构,我们也可以用递归来实现。
3.代码
1)使用栈实现
void PrintfListFromEndToStart(Stack *s,ListNode *head)
{
if (head == NULL || s == NULL)
{
return;
}
while (head)
{
Push(s, head->e);
head = head->next;
}
while (!IsEmpty(s))
{
printf("%d",s->top->e);
Pop(s);
}
}
2)使用递归实现
void PrintfListFromEndToStart2(ListNode *head)
{
if (head == NULL)
{
return ;
}
else
{
PrintfListFromEndToStart2(head->next);
printf("%d",head->e);
}
}
3)栈的实现
typedef int Item;
typedef struct node
{
Item e;
struct node* down;
}Node;
typedef struct stack
{
Node *top;
int size;
}Stack;
Stack* InitStack()
{
Stack *s = (Stack*)malloc(sizeof(Stack));
if (s != NULL)
{
s->size = 0;
s->top = NULL;
}
return s;
}
int IsEmpty(Stack *s)
{
if (s == NULL || s->size == 0 || s->top == NULL)
{
return 1;
}
else
{
return 0;
}
}
void Push(Stack *s,Item e)
{
if (s == NULL)
{
return ;
}
Node *n = (Node*)malloc(sizeof(Node));
n->down = s->top;
n->e = e;
s->top = n;
s->size ++;
}
Node* Pop(Stack *s)
{
if (s == NULL)
{
return NULL;
}
Node *n= s->top;
s->top = s->top->down;
s->size --;
return n ;
}
Node* GetTop(Stack *s)
{
if (s == NULL)
{
return NULL;
}
return s->top;
}