[剑指offer]面试题5:从尾到头打印链表
面試題5:從尾到頭打印鏈表
題目:輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值。
鏈表結點定義如下:
struct ListNode {int m_nKey;ListNode *m_pNext; };通常打印是一個只讀操作,我們不希望打印時修改內容。
假設面試官也要求這個題目不能改變鏈表的結構。
接下來我們想到解決這個問題肯定要遍歷鏈表。
遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。
也就是說第一個遍歷到的結點最后一個輸出,而最后一個遍歷到的結點第一個輸出。
這就是典型的“后進先出”,我們可以用棧實現這種順序。
每經過一個結點的時候,把該結點放到一個棧中。
當遍歷完整個鏈表后,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。
這種思路的實現代碼如下:
void PrintListReversingly_Iteratively(ListNode *pHead) {stack<ListNode *>nodes;ListNode *pNode = pHead;while (pNode != nullptr){nodes.push(pNode);pNode = pNode->m_pNext;}while (!nodes.empty()){pNode = nodes.top();cout << pNode->m_nKey << " ";nodes.pop();}cout << endl; }既然想到了用棧來實現這個函數,而遞歸在本質上就是一個棧結構,于是很自然地又想到了用遞歸來實現。要實現反過來輸出鏈表,我們每訪問到一個結點的時候,先遞歸輸出它后面的結點,再輸出該結點自身,這樣鏈表的輸出結果就反過來了。
基于這樣的思路,不難寫出如下代碼:
上面的基于遞歸的代碼看起來很簡潔,但有個問題:當鏈表非常長的時候,就會導致函數調用的層級很深,從而有可能導致函數調用棧溢出。顯式用棧基于循環實現的代碼的魯棒性要好一些。
測試用例:
● 功能測試(輸入的鏈表有多個結點,輸入的鏈表只有一個結點)。
● 特殊輸入測試(輸入的鏈表頭結點指針為NULL)。
本題考點:
● 考查對單項鏈表的理解和編程能力。
● 考查對循環、遞歸和棧3個相互關聯的概念的理解。
總結
以上是生活随笔為你收集整理的[剑指offer]面试题5:从尾到头打印链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何制作微视频
- 下一篇: [剑指offer]面试题7:用两个栈实现