題目:輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下:
struct listnode
int m_nkey;
listnode* m_pnext;
分析:這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試、筆試題中。
看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方向。然後就可以從頭到尾輸出了。反轉鍊錶的演算法詳見本人面試題精選系列的第19題,在此不再細述。但該方法需要額外的操作,應該還有更好的方法。
接下來的想法是從頭到尾遍歷鍊錶,每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始輸出結點的值,此時輸出的結點的順序已經反轉過來了。該方法需要維護乙個額外的棧,實現起來比較麻煩。
既然想到了棧來實現這個函式,而遞迴本質上就是乙個棧結構。於是很自然的又想到了用遞迴來實現。要實現反過來輸出鍊錶,我們每訪問到乙個結點的時候,先遞迴輸出它後面的結點,再輸出該結點自身,這樣鍊錶的輸出結果就反過來了。
基於這樣的思路,不難寫出如下**:
// reverselink.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include using namespace std;
struct listnode
;listnode* link_create(int n)//建立n個節點的迴圈鍊錶
p->m_pnext = null;//最後乙個節點指向頭部,形成迴圈鍊錶
return head;
}listnode* reverseiteratively(listnode* phead)//本身就把鍊錶進行了翻轉,按順序列印就是翻轉後鍊錶的元素
return preversedhead;
}//使用遞迴實現鍊錶反向輸出
void printlistreversely(listnode* plisthead)
// print this node
printf("%d", plisthead->m_nkey); }}
void printf_link_reverse(listnode* phead)
cout}
}int _tmain(int argc, _tchar* argv)
從尾到頭輸出鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 分析 這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試 筆試題中。看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方...
從尾到頭輸出鍊錶
題目 輸入乙個煉表頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 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...