題目:輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值。
鏈表結點的定義如下:
struct ListNode { int m_nKey; ListNode m_pNext; };
思路分析:解決這個問題要遍歷鏈表。鏈表的順序是從頭到尾的順序,輸出的順序是從尾到頭,是典型的後進先出,可以用棧來實現這種順序。
c++代碼實現:
void PrintListReversingly_Iteratively(ListNode* pHead)
{
std::stack<ListNode*> nodes;
ListNode* pNode = pHead;
while(pNode!=NULL)
{
nodes.push(pNode);
pNode=pNode->m_pNext;
}
//當遍歷完整個鏈表之後,再從棧頂開始逐個輸出結點的值
while(!nodes.empty())
{
pNode=nodes.top();
printf("%d\t",pNode->m_nKey);
nodes.pop();
}
}
用棧來實現這個函數,而遞歸在本質上就是一個棧結構,考慮用遞歸實現。要實現反過來輸出鏈表,當每訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出該結點自身,這樣鏈表的輸出結果就反過來了。
void PrintListReversingly_Recursively(ListNode* pHead)
{
if(pHead!=Null)
{
if(pHead->m_pNext!=Null)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t",pHead->m_nKey);
}
}