劍指offer第5題 從尾到頭逆序列印單鏈表

2021-08-02 20:46:57 字數 1028 閱讀 7038

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

根據題目,我們知道這是乙個帶有頭結點的單鏈表對吧,那麼我們首先就可以定義乙個結構體用來描述這個節點:

struct listnode 

};

下面我呢介紹兩種方法解決這個問題

我們知道,正常來說,有頭結點的話,我們直接從頭結點遍歷去列印就行了,但是呢我們現在是需要逆序列印,所以我們一定需要先到尾節點再列印。

其次,我們知道如果這是乙個雙向鍊錶,帶有prev這個指向前乙個節點的指標,那麼也可以根據頭結點很方便的去列印,直接從頭結點開始不斷指向前乙個節點就好了。

但是,我們現在沒有prev這個指標,如果要逆序列印就必須先到最後的尾節點。所以,我們可以用遞迴的方式去走到最後乙個節點,然後再去列印。

下面呢我們通過**來解釋:

void printlistfromtailtohead_r(listnode* head)

}

首先,我們判斷頭結點是否為空,如果為空,那麼可以直接退出了,畢竟這個鍊錶就是空的。

如果鍊錶不為空,那麼我們呢就需要去判斷從頭結點開始的下乙個節點是否為空,如果不為空,那麼就遞迴走下去,如果為空了,那麼就列印,並且往後退,直到退出遞迴。

這一種不利用遞迴的方式其實很多人都很熟悉,那就是去利用棧的特性。棧是先進後出的特性,所以你只需要不斷地往棧裡面壓入資料,那麼第乙個進去的資料肯定是最後乙個出棧,那麼就可以模擬實現遞迴的效果了。在所有資料都壓入棧之後,我們再去選擇列印,當棧不為空時,列印棧頂的資料,然後把棧頂元素刪掉,這樣就可以調到下乙個元素了。

**:

void printlistfromtailtohead_stack(listnode* head)

while (!s.empty())

}

注:在vs2013編譯器下實現的**

劍指offer 從尾到頭列印列表

1.方法一 看到這道題的時候,我的最初想法是鍊錶翻轉,在輸出。在原書中作者認為這不是最好的解決辦法,因為這樣會改變鍊錶的原來的結構,如果在面試中遇到類似的問題,應該主動詢問面試官這樣的方發是否可行。1.方法二 鍊錶的逆序列印,首先肯定要遍歷鍊錶,可是輸出的順序卻是從尾到頭。也就是說,第乙個遍歷到的節...

劍指offer 程式設計題 從尾到頭列印鍊錶

輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。struct listnode 方案1 使用兩個vector,乙個vector用於在鍊錶遍歷的時候儲存鍊錶中的val值,然後方向輸出值儲存到另乙個vector中。class solution vectorresult for int i...

劍指Offer 程式設計題 從尾到頭列印鍊錶

輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。有三種思路,第一就是利用棧先入後出的特性完成,第二就是存下來然後進行陣列翻轉。第三是利用遞迴。陣列反轉實現方式 1 頭節點傳入,開始建立a資料,頭節點的next指向a資料的記憶體位址,a節點的next替換成頭節點的 2 頭節點再傳入,建立...