陣列VS單鏈表

2021-10-02 17:39:04 字數 899 閱讀 8847

陣列需要一塊連續的記憶體空間來儲存,對記憶體的要求比較高。

鍊錶恰恰相反,它並不需要一塊連續的記憶體空間,它通過「指標」將一組零散的記憶體塊串聯起來使用。

如果我們申請乙個 100mb 大小的陣列,當記憶體中沒有連續的、足夠大的儲存空間時,即便記憶體的剩餘總可用空間大於 100mb,仍然會申請失敗。如果我們申請的是 100mb 大小的鍊錶,根本不會有問題。

陣列的缺點是大小固定,一經宣告就要占用整塊連續記憶體空間。如果宣告的陣列過大,系統可能沒有足夠的連續記憶體空間分配給它,導致「記憶體不足(out of memory)」。如果宣告的陣列過小,則可能出現不夠用的情況。這時只能再申請乙個更大的記憶體空間,把原陣列拷貝進去,非常費時。

鍊錶本身沒有大小的限制,天然地支援動態擴容

進行陣列的插入、刪除操作時,為了保持記憶體資料的連續性,需要做大量的資料搬移,所以時間複雜度是 o(n)。

鍊錶中插入或者刪除乙個資料,我們並不需要為了保持記憶體的連續性而搬移結點,因為鍊錶的儲存空間本身就不是連續的。

所以,在鍊錶中插入和刪除乙個資料是非常快速的,對應的時間複雜度是 o(1)。

單鏈表的插入、刪除操作的時間複雜度是 o(1) ,但僅僅是插入和刪除操作的時間複雜度為o(1),在實際的軟體開發中,從鍊錶中刪除乙個資料無外乎這兩種情況:1.刪除結點中「值等於某個給定值」的結點;2.刪除給定指標指向的結點。

這兩種情況都需要遍歷找到相應的節點,儘管單純的刪除操作時間複雜度是 o(1),但遍歷查詢的時間是主要的耗時點,對應的時間複雜度為 o(n)。

陣列有下標,通過下標隨機訪問的時間複雜度為 o(1)。

鍊錶中的資料並非連續儲存的,所以無法像陣列那樣,根據首位址和下標,通過定址公式就能直接計算出對應的記憶體位址,而是需要根據指標乙個結點乙個結點地依次遍歷,直到找到相應的結點。

鍊錶隨機訪問的效能沒有陣列好,需要 o(n) 的時間複雜度。

陣列insert 陣列實現單鏈表

單鏈表常見的實現方法有兩種,一種方式是定義乙個結構體表示鍊錶節點。比如 struct node 然後就是通過next指標將鍊錶的所有節點連線起來。如果涉及到鍊錶節點的插入和刪除操作,則只需要修改鍊錶節點的指標即可。這種方式有個明顯的缺點,就是不能隨機訪問。如果要在某個節點之後插入或者刪除節點,複雜度...

單鏈表的陣列實現

解決圖 和樹的存 儲問題。解決圖和樹的儲存問題。解決圖和樹的 儲存問題 題目 實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插...

單鏈表(合併單鏈表)

單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...