鍊錶的建立、結點的插入、結點的刪除等操作都只需要20行左右的**就能實現,其**量比較適合面試。
鍊錶問題:面試題5「從尾到頭輸出鍊錶」、面試題13「在o(1)時間刪除鍊錶結點」、面試題15「鍊錶中的倒數第k個結點」、面試題16「反轉鍊錶」、面試題17「合併兩個排序的鍊錶」、面試題37「兩個鍊錶的第乙個公共結點」、面試題45「圓圈中最後剩下的數字」、面試題27「二叉搜尋樹與雙向鍊錶」、面試題26「複雜鍊錶的賦值」。
輸入乙個鍊錶的頭結點,從尾到頭反過來點每個結點的值。
遍歷的順序是從頭到尾,可是卻要從尾到頭列印,符合「後進先出」棧的規律。
源**:
void printreversingly_iteratively(listnode *phead)
else
while (!st.empty())
}}
既然想到用棧來實現這個函式,而遞迴的本質就是乙個棧結構,所以本函式也可以用遞迴來解決。
源**:
void printreversingly_recursively(listnode *phead)
}
注意:當鍊表非常長的時候,就會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位。
標頭檔案list.h
#ifndef list_node_h
#define list_node_h
namespace listspace
; listnode * createlistnode(int valude);
void connectlistnodes(listnode *pcurrent, listnode *pnext);
void printlistnode(listnode *phead);
void printlist(listnode *phead);
void printreversingly_iteratively(listnode *phead);
void printreversingly_recursively(listnode *phead);
void destorylist(listnode **phead);
void addtotail(listnode ** phead, int value);
void removenode(listnode ** phead, int value); }
#endif
原始檔list.cpp
#include"list.h"
#include#includenamespace listspace
void connectlistnodes(listnode *pcurrent, listnode *pnext) }
void printlistnode(listnode *phead)
void printlist(listnode *phead)
}} void printreversingly_iteratively(listnode *phead)
else
while (!st.empty())
}} void printreversingly_recursively(listnode *phead) }
void destorylist(listnode **phead) }
void addtotail(listnode ** phead, int value) }
void removenode(listnode ** phead, int value)
else
}if (ptobedeleted != null)
}}
測試檔案
#include"list.h"
#includeusing namespace listspace;
void test(listnode* phead)
// 1->2->3->4->5
void test1()
// 只有乙個結點的鍊錶: 1
void test2()
// 空鍊錶
void test3()
int main()
執行結果:
test1 begins.
1 2 3 4 5 5 4 3 2 1
5 4 3 2 1
test2 begins.
1 1
1test3 begins.
the list is empty
請按任意鍵繼續. . .
從尾到頭列印單鏈表(劍指offer面試題5)
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。分析 此題考察單鏈表的理解和應用,為了實現列印,必須先建立乙個單鏈表,頭結點可有可無,但有頭結點和無頭結點在程式設計上是應該注意的,反向列印思路不一樣,這裡以包含頭結點舉例分析,單鏈表以尾部插入方式建立,頭結點資料域為空,頭結點指標指向下...
劍指Offer 面試題5 從尾到頭列印鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印每個節點的值.分析1 通常,列印是乙個唯讀操作,我們不希望列印的同時去修改原資料的內容.故我們不能改變鍊錶的結構.解決這個問題肯定是需要遍歷鍊錶的,但是遍歷的順序是從頭到尾的,可輸出的順序確實從尾到頭,也就是說第乙個遍歷到的節點最後乙個輸出,最後乙個遍歷...
劍指offer 面試題5 從尾到頭列印鍊錶
題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。public void invertedlist1 listnode head listnode p head stack integer stack new stack integer while p null while stack ...