《演算法之美》 鍊錶問題 從尾到頭輸出鍊錶

2021-08-25 07:59:06 字數 1025 閱讀 6861

題目:輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下:

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...