題目:輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下:
struct
listnode ;
分析:這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試、筆試題中。
看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方向。然後就可以從頭到尾輸出了。但該方法需要額外的操作,應該還有更好的方法。
接下來的想法是從頭到尾遍歷鍊錶,每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始輸出結點的值,此時輸出的結點的順序已經反轉過來了。該方法需要維護乙個額外的棧,實現起來比較麻煩。
既然想到了棧來實現這個函式,而遞迴本質上就是乙個棧結構。於是很自然的又想到了用遞迴來實現。要實現反過來輸出鍊錶,我們每訪問到乙個結點的時候,先遞迴輸出它後面的結點,再輸出該結點自身,這樣鍊錶的輸出結果就反過來了。
基於這樣的思路,不難寫出如下**:
#include
struct
listnode ;
void
initlist(listnode** plist)
void
insertlist(listnode* plist,
intdata)
void
printlistnormally(listnode* plisthead)
}void
printlistreversely(listnode* plisthead)
std::cout}
intmain()
printlistnormally(plisthead);
printlistreversely(plisthead->m_pnext);
system(
"pause");
return0;
} 擴充套件:該題還有兩個常見的變體: 1.
從尾到頭輸出乙個字串; 2.
定義乙個函式求字串的長度,要求該函式體內不能宣告任何變數。
從尾到頭輸出鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 分析 這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試 筆試題中。看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方...
從尾到頭輸出鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode int m nkey listnode m pnext 分析 這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試 筆試題中。看到這道題後,第一反應是從頭到尾輸出比較簡單。於是...
從尾到頭輸出鍊錶
題目 輸入乙個煉表頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 這裡我們使用另一種更為簡單的方法 遞迴 include stdafx.h include include using namespace std struct listnode 構造鍊錶 vo...