題目:輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。到解決這個問題肯定要遍歷鍊錶。遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。也就是說第乙個遍歷到的結點最後乙個輸出,而最後乙個遍歷到的結點第乙個輸出。這就是典型的「後進先出」,我們可以用棧實現這種順序。
每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。
這裡使用的是自定義實現的鍊錶類,其節點定義如下:
public這裡的自定義的單鏈表的實現請參考:《資料結構基礎溫故-1.線性表(中)》class node
//指標域
public nodenext
public
node()
public
node(t item)
}
(1)基於棧的迴圈版本
public(2)遞迴版本static
void printlistreversinglyiteratively(nodehead)
//棧中的單鏈表元素依次出棧
while (stacknodes.count > 0
)
", top.item);}}
public兩個版本的對比:上面的基於遞迴的**看起來很簡潔,但有個問題:當鍊表非常長的時候,就會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位。顯式用棧基於迴圈實現的**的魯棒性要好一些。static
void printlistreversinglyrecursively(nodehead)
console.write(""
, head.item);}}
(1)單元測試主入口
//在測試入口中,我們首先正序列印鍊錶,然後使用迴圈版從尾到頭列印鍊錶,最後使用遞迴版從尾到頭列印鍊錶。測試主入口
static
void printtestportal(nodehead)
//輔助方法:正序列印鍊錶
static
void normalprint(nodehead)
",temp.item);
temp =temp.next;}}
(2)正常的多元素鍊錶
//(3)只有乙個節點的鍊錶1->2->3->4->5
static
void
printtest1()
//(4)魯棒性測試:null只有乙個節點的鍊錶
static
void
printtest2()
//測試結果如下圖所示:空鍊錶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 兩個鍊錶的第乙個公共結點 面...