题目:输入一个链表的头结点,在不改变链表本身的情况下,从尾到头打印出每个结点的值。


法一:

    假设链表如下: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;
}