演算法學習 05 從尾到頭列印鍊錶

2021-10-18 06:41:18 字數 2941 閱讀 2994

題目:輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist。

輸入:輸出:[58,24,0,67]

分析:我們可以先遍歷一遍鍊錶,將每個節點的值依次儲存在乙個陣列中,再交換陣列中元素的順序,使之成為從尾到頭。

大概步驟如下:

依次遍歷鍊錶,並把每個節點值依次儲存在陣列中。

交換陣列中元素的順序,使之成為從尾到頭。

非遞迴版本:c++**實現

vector<

int>

printlistfromtailtohead

(listnode* head)

;

vector<

int> ans;

while

(head !=

nullptr

)int left =0;

for(

int right = ans.

size()

-1; left < right; left++

, right--

)return ans;

}

但是這種方法需要我們先遍歷一遍鍊錶,然後再交換陣列元素的位置,有沒有什麼方法可以再一次遍歷完鍊錶以後就得到從尾到頭順序的陣列,而不需要再進行位置交換?因為鍊錶節點數量是未知的,所以我們不能一開始就確定好陣列的大小,然後從後往前放入元素。但是我們可以採用遞迴的方法(結合dfs思路),先通過遞迴找到最後的元素,然後再從最後乙個元素從後往前將每個節點的值放入陣列中。

遞迴版本**如下:

vector<

int>

printlistfromtailtohead

(listnode* head)

return ans;

}

其實遞迴和非遞迴版本的時間複雜度都是o(n),但是在實際執行中非遞迴的方法速度要比遞迴的方法快很多。遞迴實際執行時間還要更久一些,因為遞迴呼叫時間開銷比迴圈要大很多

時間對比結果(定義了乙個20000個節點的鍊錶)

對比實驗**:

#include

#include

// #include "data_struct.h"

#include

using

namespace std;

struct listnode };

vector<

int>

unrecursion_printlistfromtailtohead

(listnode* head)

;

vector<

int> ans;

while

(head !=

nullptr

)int left =0;

for(

int right = ans.

size()

-1; left < right; left++

, right--

)return ans;

}//遞迴的寫法

vector<

int>

recursion_printlistfromtailtohead

(listnode* head)

return ans;

}int

main()

cout<< endl;

clock_t starttime_recursion, endtime_recursion, starttime_unrecursion, endtime_unrecursion;

vector<

int> recursion_ans;

vector<

int> unrecursion_ans;

starttime_recursion =

clock()

; recursion_ans =

recursion_printlistfromtailtohead

(list)

; endtime_recursion =

clock()

; starttime_unrecursion =

clock()

; unrecursion_ans =

unrecursion_printlistfromtailtohead

(list)

; endtime_unrecursion =

clock()

; cout<<

<<

(double

)(endtime_recursion - starttime_recursion)

*1000

/ clocks_per_sec <<

"ms"

<< endl;

// for(int i = 0; i < 10000; i++)

// cout

<<

(double

)(endtime_unrecursion - starttime_unrecursion)

*1000

/ clocks_per_sec <<

"ms"

<< endl;

// for(int i = 0; i < 10000; i++)

// cout

"整個程式執行時間(建立鍊錶+兩種倒置方法): "

<<

(double

)clock()

*1000

/ clocks_per_sec <<

"ms"

<< endl;

return-1

;}

演算法 從尾到頭列印鍊錶

題目 輸入乙個鍊錶,要求從尾到頭列印該鍊錶,鍊錶結點定義如下 struct listnode 解題思路 要求很好理解,比如乙個鍊錶是 列印的結果是 6 5 4 3 2 1 1.相信大多數人看到這個要求後的第一反應是反轉鍊錶,再從頭列印,但是這樣一來,原始資料就改變了。2.當然我們可以建立新的記憶體空...

從尾到頭列印鍊錶

題目描述 輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。輸入 每個輸入檔案僅包含一組測試樣例。每一組測試案例包含多行,每行乙個大於0的整數,代表乙個鍊錶的節點。第一行是鍊錶第乙個節點的值,依次類推。當輸入到 1時代表鍊錶輸入完畢。1本身不屬於鍊錶。輸出 對應每個測試案例,以從尾到頭的順序輸出鍊錶每個節...

從尾到頭列印鍊錶

1.問題描述 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。來自 劍指offer 2.分析 通常遍歷乙個鍊錶都是從頭開始遍歷的,現在讓我們從尾到頭列印結點的值,我們可以使用棧這種資料結構 因為先進後出 來儲存鍊錶,然後在彈出棧中的元素,從而從尾到頭列印出結點的值。另外 遞迴在本質上就是乙個...