【劍指offer】2.3.3 鏈表

面試題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;
}

    既然想到了用棧來實現,而遞歸在本質上就是棧結構,於是又想到用遞歸實現。要實現反過來輸出鏈表,每次訪問到一個結點的時候,先遞歸輸出它後面的結點,再輸出結點自身。在這裏就不實現了。不過有一個問題是當鏈表非常長的時候,就會導致函數調用的層數很深,從而有可能導致函數調用堆棧溢出。顯然用棧基於循環實現的代碼的魯棒性要好一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章