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

2022-01-11 10:00:15 字數 1825 閱讀 5089

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

到解決這個問題肯定要遍歷鍊錶。遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。也就是說第乙個遍歷到的結點最後乙個輸出,而最後乙個遍歷到的結點第乙個輸出。這就是典型的「後進先出」,我們可以用棧實現這種順序。

每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。

這裡使用的是自定義實現的鍊錶類,其節點定義如下:

public

class node

//指標域

public nodenext

public

node()

public

node(t item)

}

這裡的自定義的單鏈表的實現請參考:《資料結構基礎溫故-1.線性表(中)》

(1)基於棧的迴圈版本

public

static

void printlistreversinglyiteratively(nodehead)

//棧中的單鏈表元素依次出棧

while (stacknodes.count > 0

)

", top.item);}}

(2)遞迴版本

public

static

void printlistreversinglyrecursively(nodehead)

console.write(""

, head.item);}}

兩個版本的對比:上面的基於遞迴的**看起來很簡潔,但有個問題:當鍊表非常長的時候,就會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位顯式用棧基於迴圈實現的**的魯棒性要好一些

(1)單元測試主入口

//

測試主入口

static

void printtestportal(nodehead)

//輔助方法:正序列印鍊錶

static

void normalprint(nodehead)

",temp.item);

temp =temp.next;}}

在測試入口中,我們首先正序列印鍊錶,然後使用迴圈版從尾到頭列印鍊錶,最後使用遞迴版從尾到頭列印鍊錶。

(2)正常的多元素鍊錶

//

1->2->3->4->5

static

void

printtest1()

(3)只有乙個節點的鍊錶

//

只有乙個節點的鍊錶

static

void

printtest2()

(4)魯棒性測試:null

//

空鍊錶static

void

printtest3()

測試結果如下圖所示:

出處:

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

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印每個結點的值。採用兩種方法實現 1 不修改原列表,使用stack的方式實現 2 修改原列表,對元列表逆序 兩種方法都在下面的 中 struct node class listex listex m phead null m ptail null void...

從尾到頭列印單鏈表(劍指offer面試題5)

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。分析 此題考察單鏈表的理解和應用,為了實現列印,必須先建立乙個單鏈表,頭結點可有可無,但有頭結點和無頭結點在程式設計上是應該注意的,反向列印思路不一樣,這裡以包含頭結點舉例分析,單鏈表以尾部插入方式建立,頭結點資料域為空,頭結點指標指向下...

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

鍊錶的建立 結點的插入 結點的刪除等操作都只需要20行左右的 就能實現,其 量比較適合面試。鍊錶問題 面試題5 從尾到頭輸出鍊錶 面試題13 在o 1 時間刪除鍊錶結點 面試題15 鍊錶中的倒數第k個結點 面試題16 反轉鍊錶 面試題17 合併兩個排序的鍊錶 面試題37 兩個鍊錶的第乙個公共結點 面...