题目:很简单,就是题目,将链表从尾到头打印出来。
可能我们首先想到的是将链表进行遍历,将之前的访问的数据进行保存,最后进行反向输出,可是保存数据的空间是个问题;或者是我们将整个链表进行反向操作,将整个链表进行逆置,可是我们只是进行打印操作而已,改变链表不合适吧...
其实这时候应该想到了,用栈:既然是逆置,和栈的功能不就不谋而合吗,后进先出,进行反向打印。
//2014-5-18
//反向输出链表
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
typedef struct Node
{
int data;
struct Node *next; /* 指向下个节点 */
} Node, *LinkNode;
void Create(LinkNode &head)
{
head = (LinkNode) malloc(sizeof(Node));
head->next = NULL;
}
void Insert(LinkNode &head, int i)
{
if(head -> next == NULL)
{
LinkNode p = (LinkNode) malloc(sizeof(Node));
p->data = i;
p->next = head->next;
head->next = p;
return;
}
LinkNode p = head;
while(p->next != NULL)
{
p = p->next;
}
LinkNode q = (LinkNode) malloc(sizeof(Node));
q->data = i;
q->next = p->next;
p->next = q;
//free(q);
return;
}
void OppoLink(const LinkNode &L)
{
if(L == NULL)
return;
LinkNode p = L->next;
stack<int> node;
while(p != NULL)
{
node.push(p->data);
p = p->next;
}
while(!node.empty())
{
cout << node.top() << " ";
node.pop();
}
cout << endl;
}
int main()
{
LinkNode L;
Create(L);
for(int i = 0; i < 10; i++)
{
Insert(L, i);
}
OppoLink(L);
return 0;
}
输出如下:
书中也是如我这般的,不过对于栈的处理不同,我是使用stack<int> node;进行数据存储,而书中则是使用节点存储,不过我想这应该差不多吧...(具体我也不知道,如果有什么看法的希望指出)
书中给出如下一段话:
这个我倒是真没想到,不过按照提示递归实现了:
void OppoLink(LinkNode L)
{
if(L!=NULL)
{
if(L->next != NULL)
{
OppoLink(L->next);
}
cout << L->data << " ";
}
}
在调用的时候用OppoLink(L->next),因为我创建的链表有个头结点,当然,它里面的数据很意外。。。
不过对于递归大家肯定知道,层数深了的话,后果很可怕,所以我想用栈应该会更好一些。
O(∩_∩)O欢迎指教啦....