题目:输入一个链表的头结点,在不改变链表本身的情况下,从尾到头打印出每个结点的值。
法一:
假设链表如下:1 2 3 4 5 6,如果我们顺序遍历链表的话,则依次遍历到1 2 3 4 5 6,而我们要打印出6 5 4 3 2 1,对比两个序列发现,“反向”,我们很自然就想到使用栈这个数据结构。
法二:
既然想到了用栈这个数据结构,而递归本质上就是一个栈结构,于是很自然的就想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
源代码如下:
#include <iostream>
#include <stdlib.h>
#include <stack>
struct Node
{
int data;
struct Node *next;
};
void CreateList(struct Node *head)
{
std::cout << "请输入一系列整数,以-1结尾" << std::endl;
int d;
std::cin>>d;
struct Node *tmp = head;
while(d != -1)
{
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->data = d;
tmp->next = node;
tmp = node;
std::cin>>d;
}
tmp->next = NULL;
}
void ReverseOut1(struct Node head)
{
struct Node *tmp = head.next;
std::stack<int> s;
while(tmp != NULL)
{
s.push(tmp->data);
tmp = tmp->next;
}
int d;
while(!s.empty())
{
d = s.top();
std::cout << d << " ";
s.pop();
}
}
void ReverseOut2(struct Node *head)
{
if(head->next)
ReverseOut2(head->next);
std::cout << head->data << " ";
}
int main()
{
struct Node Head;
CreateList(&Head);
ReverseOut1(Head);
ReverseOut2(Head.next);
return 0;
}
转载于:https://blog.51cto.com/7876369/1555475