劍指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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章