日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer]面试题5:从尾到头打印链表

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指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; }

既然想到了用棧來實現這個函數,而遞歸在本質上就是一個棧結構,于是很自然地又想到了用遞歸來實現。要實現反過來輸出鏈表,我們每訪問到一個結點的時候,先遞歸輸出它后面的結點,再輸出該結點自身,這樣鏈表的輸出結果就反過來了。
基于這樣的思路,不難寫出如下代碼:

void PrintListReversingly_Iteratively(ListNode *pHead) {if (pHead != nullptr){if (pHead->m_pNext != nullptr){PrintListReversingly_Iteratively(pHead->m_pNext);}cout << pHead->m_nKey << " ";} }

上面的基于遞歸的代碼看起來很簡潔,但有個問題:當鏈表非常長的時候,就會導致函數調用的層級很深,從而有可能導致函數調用棧溢出。顯式用棧基于循環實現的代碼的魯棒性要好一些。

測試用例:
● 功能測試(輸入的鏈表有多個結點,輸入的鏈表只有一個結點)。
● 特殊輸入測試(輸入的鏈表頭結點指針為NULL)。
本題考點:
● 考查對單項鏈表的理解和編程能力。
● 考查對循環、遞歸和棧3個相互關聯的概念的理解。

總結

以上是生活随笔為你收集整理的[剑指offer]面试题5:从尾到头打印链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。