既然反向输出链表,那就利用栈这个LIFO特性。堆栈中存节点的指针,而非节点的数据域的值。参考了剑指offer的代码,但是还是有点不明白为什么增加节点那里需要的函数参数是指向节点的指针的指针,有待以后继续思考。
代码如下:
#include<iostream>
#include<stack>
#include<list>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode * m_pNext;
};
ListNode * CreateList(int value) //构建链表,返回指向头节点的指针
{
ListNode * pnode = new ListNode();
pnode->m_nKey = value;
pnode->m_pNext = NULL;
return pnode;
}
void AddToTail(ListNode ** phead ,int value) //在链表头节点后加节点
{
ListNode * pnew = new ListNode();
pnew->m_nKey = value;
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 printlistreverse(ListNode * phead)
{
stack<ListNode*> sti;
ListNode *p = phead;
while (p != NULL)
{
sti.push(p);
p = p->m_pNext;
}
while(!sti.empty())
{
ListNode* temp;
temp = sti.top();
sti.pop();
cout << temp->m_nKey << " ";
}
cout << endl;
}
int main()
{
ListNode* pn = CreateList(1);
AddToTail(&pn, 2);
AddToTail(&pn, 3);
AddToTail(&pn, 4);
AddToTail(&pn, 5);
AddToTail(&pn, 6);
printlistreverse(pn);
return 0;
}