題目:輸入乙個鍊錶的頭結點,從尾到頭列印單鏈表
鍊錶結點的定義:
struct linknode
方法一:
//遞迴實現
void printlisttailtohead(struct listnode *head)
printf("%d\n", head->val);}}
我們知道遞迴也是一種棧結構,通過分析子問題,找到遞迴出口,我們知道棧的特點是「後進先出」,我們每訪問乙個節點,先遞迴輸出它的下乙個節點,再輸出該節點的本身,這樣就可以從頭到尾列印單鏈表;
但我們知道要不斷的壓棧和出棧,時間複雜度o(n^2);
方法二:
棧實現:
遍歷的順序是從頭到尾,列印的順序是從尾到頭,也就是遍歷的第乙個節點最後輸出,遍歷的第乙個節點最後輸出,這是典型的後進先出,符合棧的結構;
利用棧的性質後進先出;把鍊錶的節點順序壓棧,出棧自然就可以實現從尾到頭列印了。
//棧實現
void printlisttailtohead(struct listnode *head)
//出棧
while (!s.empty())
cout
<< endl;
}
時間複雜度是o(n);
方法三:
利用反向迭代器
vector
printlisttailtohead(struct listnode *head)
return
vector
(v.rbegin(),v.rend());
}
時間複雜度是o(n);
前年我們知道迭代器其實是一種智慧型指標,在list中相當於節點指標,在vector中其實是一種原生指標;通過運算子operator++,operator–,以及operator*和operator->來實現函式的功能;
迭代器的模擬實現:
從尾到頭列印單鏈表
由於單鏈表只能從按單個方向訪問下乙個節點,而不能訪問前乙個節點。首先,解決這個問題肯定要遍歷鍊錶。遍歷的順序是從頭到尾的順序,可輸出的順序卻是從尾到頭。也就是說第乙個遍歷到的結點最後乙個輸出,而最後乙個遍歷到得結點第乙個輸出。這就是典型的 後進先出 可以用 棧實現這種順序。實現程式過程 每經過乙個結...
從尾到頭列印單鏈表
include using namespace std include includetypedef struct node 節點結構 node node create 尾插法建立單鏈表 else q p p node malloc sizeof node p next null if flag 0...
從尾到頭列印單鏈表
可運用兩種方法列印 方法一 迴圈演算法 方法二 遞迴壓棧呼叫 方法一 先呼叫我們已經寫好的煉表頭檔案list.h鍊錶構造方面不過多說明。void printreverse listnode first 要列印的結點 printf d cur data end cur 1.通過cur next end...