代码如下:
//题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。
#include <iostream>
#include <stdlib.h>
#include <stack>
using namespace std;
//链表节点结构.
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
//创建一个链表结点
ListNode* create_list_node(int value)
{
ListNode *pNode = new ListNode();
pNode->m_nKey = value;
pNode->m_pNext = NULL;
return pNode;
}
//向链表末尾添加结点.
//注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。
//因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。
void add_to_tail(ListNode **pHead,int val)
{
ListNode *pNew = new ListNode();
pNew->m_nKey = val;
pNew->m_pNext = NULL;
//链表为空.
if (*pHead == NULL)
*pHead = pNew;
//链表不为空.
else
{
ListNode * pNode = *pHead;
while (pNode->m_pNext != NULL)
pNode = pNode->m_pNext;
pNode->m_pNext = pNew;
}
}
//遍历链表中的所有结点
void print_list(ListNode* pHead)
{
ListNode *pNode = pHead;
while(pNode != NULL)
{
cout << pNode->m_nKey << " ";
pNode = pNode->m_pNext;
}
cout<<endl;
}
//版本1:“先入后出”,用栈的方式实现.
void print_list_reversely(ListNode *pHead)
{
//存放链表指针的栈.
stack <ListNode*> nodes;
ListNode* pNode = pHead;
//将所有链表指针存入栈.
while (pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while (!nodes.empty())
{
pNode = nodes.top();
cout << pNode->m_nKey << " ";
nodes.pop();
}
cout << endl;
}
int main()
{
ListNode* pNode1 = create_list_node(1);//创建一个结点
print_list(pNode1);//打印
add_to_tail(&pNode1,2);//为链表添加一个结点
add_to_tail(&pNode1,3);//为链表添加一个结点
add_to_tail(&pNode1,4);//为链表添加一个结点
add_to_tail(&pNode1,5);//为链表添加一个结点
add_to_tail(&pNode1,6);//为链表添加一个结点
add_to_tail(&pNode1,7);//为链表添加一个结点
print_list(pNode1);//打印
print_list_reversely(pNode1);
return 0;
}
运行结果:
转自:http://www.cnblogs.com/xwdreamer/archive/2012/04/26/2471962.html