题目描述:输入一个链表,从尾到头打印链表每个节点的值。
考虑用栈实现,代码如下:
/*从尾到头输出链表:栈,后进先出*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
};
/*尾部插入法插入节点*/
void Add2Tail(ListNode **head, int value)
{
ListNode *pNew = new ListNode();
pNew->val=value;
pNew->next=NULL;
//空链表
if(*head==NULL)
*head=pNew;
else
{
ListNode *node=*head;
while(node->next!=NULL) //找到现有链表中倒数第一个节点
node=node->next;
node->next=pNew; //将新节点插入链表尾部
}
}
/*删除链表中的节点*/
void RemoveNode(ListNode **head,int value)
{
if(head==NULL || *head==NULL)
return;
ListNode *deleted=NULL;
if((*head)->val==value) //如果要删除的节点为头结点
{
deleted=*head;
*head=(*head)->next;
}
else
{
ListNode *node=*head;
while(node->next!=NULL && node->next->val!=value) //寻找需要删除的节点
node=node->next;
if(node->next!=NULL && node->val==value) //找到需要删除的节点
{
deleted=node->next;
node->next=node->next->next;
}
}
if(deleted!=NULL)
{
delete deleted;
deleted=NULL;
}
}
/*逆向输出链表元素*/
void PrintListReverse(ListNode *head)
{
stack<ListNode*> ListStack;
ListNode *p=head;
if(p==NULL)
return;
while(p!=NULL)
{
ListStack.push(p);
p=p->next;
}
while(!ListStack.empty())
{
cout<<ListStack.top()->val<<" ";
ListStack.pop();
}
}
/*从头到尾打印链表元素*/
void PrintList(ListNode *head)
{
if(head==NULL)
return;
ListNode *p = head;
while (p!=NULL) //这里如果是p->next != NULL则不会打印最后一个结点内容
{
cout<<p->val<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
int N,num,delValue;
ListNode *head=NULL;
cout<<"请输入链表节点个数:";
cin>>N;
cout<<"请输入链表元素:";
for(int i=0;i<N;i++)
{
cin>>num;
Add2Tail(&head,num);
}
cout<<"您输入的链表为:";
PrintList(head);
cout<<"从尾到头打印链表为:";
PrintListReverse(head);
return 0;
}