面試題6:從尾到頭打印鏈表
題目:輸入一個鏈表的頭節點,從尾到頭反過來打印出每個結點的值。鏈表結點定義如下:
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
解答:從題目可知,第一個遍歷到的結點最後一個輸出,而最後一個遍歷到的結點第一個輸出。這就是典型的“先進後出”,可以用棧來實現這種順序。代碼如下:
vector<int> printListFromTailToHead(ListNode* head)
{
vector<int> result;
stack<int> sta;
if(NULL == head)
{
return result;
}
ListNode *p = head;
while(p != NULL)
{
sta.push(p->val);
p = p->next;
}
while(!sta.empty())
{
result.push_back(sta.top());
sta.pop();
}
return result;
}
既然想到了用棧來實現,而遞歸在本質上就是棧結構,於是又想到用遞歸實現。要實現反過來輸出鏈表,每次訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出結點自身。在這裏就不實現了。不過有一個問題是當鏈表非常長的時候,就會導致函數調用的層數很深,從而有可能導致函數調用堆棧溢出。顯然用棧基於循環實現的代碼的魯棒性要好一些。