從尾到頭輸出鍊錶

2021-06-08 15:42:18 字數 894 閱讀 6611

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

struct

listnode

;

分析:這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試、筆試題中。

看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方向。然後就可以從頭到尾輸出了。反轉鍊錶的演算法詳見本人面試題精選系列的第19題

,在此不再細述。但該方法需要額外的操作,應該還有更好的方法。

接下來的想法是從頭到尾遍歷鍊錶,每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始輸出結點的值,此時輸出的結點的順序已經反轉過來了。該方法需要維護乙個額外的棧,實現起來比較麻煩。

既然想到了棧來實現這個函式,而遞迴本質上就是乙個棧結構。於是很自然的又想到了用遞迴來實現。要實現反過來輸出鍊錶,我們每訪問到乙個結點的時候,先遞迴輸出它後面的結點,再輸出該結點自身,這樣鍊錶的輸出結果就反過來了。

基於這樣的思路,不難寫出如下**:

///

// print a list from end to beginning

// input: plisthead - the head of list

///void printlistreversely(listnode* plisthead)

// print this node

printf("%d", plisthead->m_nkey);

}}

擴充套件:該題還有兩個常見的變體:

1.從尾到頭輸出乙個字串;

2.定義乙個函式求字串的長度,要求該函式體內不能宣告任何變數。

以上**何海濤部落格

從尾到頭輸出鍊錶

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode int m nkey listnode m pnext 分析 這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試 筆試題中。看到這道題後,第一反應是從頭到尾輸出比較簡單。於是...

從尾到頭輸出鍊錶

題目 輸入乙個煉表頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 這裡我們使用另一種更為簡單的方法 遞迴 include stdafx.h include include using namespace std struct listnode 構造鍊錶 vo...

031 從尾到頭輸出鍊錶

include stdafx.h include struct listnode struct listnode creatlist int number head m nkey 0 head m pnext null temp head printf list data number d n nu...