題目:輸入一個鏈表的頭節點,從尾到頭反過來打印每個節點的值。
相信大家看到這道題的第一反應就是把這個鏈表整個給逆置過來。然後從頭到尾遍歷打印吧。當然這樣的方法可以幫助我們解決這道題,但是有個缺點就是這樣做改變了原本鏈表的結構,題目要求只是打印,我們可不可以不改變原始結構結構實現操作呢?
思路:我們發現從尾到頭打印就意味着最前面的元素最後打印,而最後的元素卻最先打印,這不就是典型的“先進後出”嗎?一說到先進後出我們腦海裏瞬間就呈現出了“棧“,沒經過一個節點我們把它放入棧中,遍歷玩整個鏈表後我們可以逐個獲取棧頂元素,然後一一打印出,這樣就實現了這道要求的打印順序。
代碼如下
#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;
}