題目:
輸入乙個鍊錶,要求從尾到頭列印該鍊錶,鍊錶結點定義如下:
struct listnode
;
解題思路:要求很好理解,比如乙個鍊錶是:
列印的結果是:6 5 4 3 2 1
1.相信大多數人看到這個要求後的第一反應是反轉鍊錶,再從頭列印,但是這樣一來,原始資料就改變了。
2.當然我們可以建立新的記憶體空間,然後拷貝原煉表中的value,畢竟最後要列印的只是value,這樣我們就有了乙個和原鍊錶的value一樣的鍊錶,然後再反轉它,這樣一來原始資料就不變了,但是這樣的操作太過繁瑣:遍歷拷貝,反轉,順序列印,釋放記憶體的一系列操作在空間和時間複雜度上都消耗較大。
3.既然上一種方法想到了建立新的鍊錶的方式,那麼何不建立乙個其他的資料結構更簡單的完成這件事—棧,這個任務的特點是先遍歷到的後列印,我們只需要將先遍歷到的結點中的value壓入棧中,遍歷結束後做出棧操作,這樣一來步驟就簡化了很多。
4.既然想到了是一種「先遍歷後列印,後遍歷先列印」的操作,那麼可不可以不借助棧來實現這個方法——遞迴。遞迴的思想在合併兩個排序的鍊錶題目中就使用過,只不過在該題目中我們返回的是最後一次遞迴的結果,而在本文的題目我們需要列印每一次遞迴的返回值。
關於思路3和4都是可以的,具體使用哪乙個可以根據實際情況來決定,如果鍊錶很長,那麼遞迴呼叫的層數就會很深,可能導致函式呼叫棧溢位,用思路3的魯棒性會更好一些。
**實現:
//借助棧
void printlistreversingly_iteratively(listnode* phead)
while(!nodes.empty())
}
//遞迴實現
void printlistreversingly_recursively(listnode* phead)
printf("%d\t", phead->value);}}
從尾到頭列印鍊錶
題目描述 輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。輸入 每個輸入檔案僅包含一組測試樣例。每一組測試案例包含多行,每行乙個大於0的整數,代表乙個鍊錶的節點。第一行是鍊錶第乙個節點的值,依次類推。當輸入到 1時代表鍊錶輸入完畢。1本身不屬於鍊錶。輸出 對應每個測試案例,以從尾到頭的順序輸出鍊錶每個節...
從尾到頭列印鍊錶
1.問題描述 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。來自 劍指offer 2.分析 通常遍歷乙個鍊錶都是從頭開始遍歷的,現在讓我們從尾到頭列印結點的值,我們可以使用棧這種資料結構 因為先進後出 來儲存鍊錶,然後在彈出棧中的元素,從而從尾到頭列印出結點的值。另外 遞迴在本質上就是乙個...
從尾到頭列印鍊錶
1 第一種方法 我們可以利用 stack 先進後出的特性來進行中轉。stacks node p head next while p while s.empty 這樣很容易就能讓鍊錶倒序輸出。2 第二種方法 我們也可以用遞迴函式來倒換 void printlistrever node phead pr...