题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值。
相信大家看到这道题的第一反应就是把这个链表整个给逆置过来。然后从头到尾遍历打印吧。当然这样的方法可以帮助我们解决这道题,但是有个缺点就是这样做改变了原本链表的结构,题目要求只是打印,我们可不可以不改变原始结构结构实现操作呢?
思路:我们发现从尾到头打印就意味着最前面的元素最后打印,而最后的元素却最先打印,这不就是典型的“先进后出”吗?一说到先进后出我们脑海里瞬间就呈现出了“栈“,没经过一个节点我们把它放入栈中,遍历玩整个链表后我们可以逐个获取栈顶元素,然后一一打印出,这样就实现了这道要求的打印顺序。
代码如下
#include<iostream>
#include<vld.h>
#include<stack>
using namespace std;
struct Node//链表结构
{
int data;
Node*next;
};
void add(Node *head,int i)//尾插法插入节点构建链表
{
Node *p= new Node;
Node *tmp;
for(tmp=head;tmp->next!=NULL;tmp=tmp->next);
tmp->next=p;
p->next=NULL;
p->data=i;
}
void remove(Node *head)//释放空间防止内存泄漏
{
Node *q;
while(head->next!=NULL)
{
q=head->next;
head->next=q->next;
delete[] q;
}
}
int main()
{
Node *head=new Node;
head->next=NULL;
for(int i=0;i<10;i++)//构建链表
{
add(head,i);
}
stack<Node*> node;
Node*m=head;
while(m!=NULL)
{
node.push(m);//遍历链表,把链表的每个节点元素放入栈中(包括头节点)
m=m->next;
}
while(!node.empty())
{
m=node.top();//获取栈顶元素进行打印
printf("%d ",m->data);
node.pop();每打印完就出栈一次
}
remove(head);//打印结束释放空间防止内存泄漏
delete[] head;
}