劍指Offer 面試題五 從尾到頭列印鍊錶

2021-07-11 22:19:43 字數 2420 閱讀 3541

鍊錶的建立、結點的插入、結點的刪除等操作都只需要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 ...