鏈表面試題 從尾到頭列印單鏈表

2021-07-30 10:14:04 字數 1120 閱讀 2907

題目:輸入乙個鍊錶的頭結點,從尾到頭列印單鏈表

鍊錶結點的定義:

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...