剑指offer面试题:从未到头打印链表(用栈实现)

题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值。

      相信大家看到这道题的第一反应就是把这个链表整个给逆置过来。然后从头到尾遍历打印吧。当然这样的方法可以帮助我们解决这道题,但是有个缺点就是这样做改变了原本链表的结构,题目要求只是打印,我们可不可以不改变原始结构结构实现操作呢?

      思路:我们发现从尾到头打印就意味着最前面的元素最后打印,而最后的元素却最先打印,这不就是典型的“先进后出”吗?一说到先进后出我们脑海里瞬间就呈现出了“栈“,没经过一个节点我们把它放入栈中,遍历玩整个链表后我们可以逐个获取栈顶元素,然后一一打印出,这样就实现了这道要求的打印顺序。

      代码如下

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值