LinkList的底層數(shù)據(jù)結(jié)構(gòu)及優(yōu)缺點(diǎn)詳解
底層數(shù)據(jù)結(jié)構(gòu)
鏈表由一系列 節(jié)點(diǎn)(Node) 組成,每個(gè)節(jié)點(diǎn)包含兩部分:
- 數(shù)據(jù)域:存儲(chǔ)實(shí)際數(shù)據(jù)。
- 指針域:存儲(chǔ)指向下一個(gè)節(jié)點(diǎn)(單向鏈表)或前驅(qū)/后繼節(jié)點(diǎn)(雙向鏈表)的地址。
- 物理存儲(chǔ):節(jié)點(diǎn)在內(nèi)存中 非連續(xù)分布,通過(guò)指針鏈接形成邏輯上的線性關(guān)系。
- 核心操作:通過(guò)指針的重新指向?qū)崿F(xiàn)插入/刪除,無(wú)需移動(dòng)其他元素。
優(yōu)點(diǎn)
1.動(dòng)態(tài)大小
- 無(wú)需預(yù)先分配固定內(nèi)存,可動(dòng)態(tài)擴(kuò)展或收縮,避免內(nèi)存浪費(fèi)。
2.高效插入/刪除
- 時(shí)間復(fù)雜度:O(1)(已知節(jié)點(diǎn)位置時(shí),如頭/尾操作)。
- 僅需修改指針,無(wú)需移動(dòng)其他元素(與數(shù)組的 O(n) 對(duì)比明顯優(yōu)勢(shì))。
3.靈活的存儲(chǔ)結(jié)構(gòu)
- 適用于頻繁修改的場(chǎng)景(如隊(duì)列、圖鄰接表)。
- 雙向鏈表支持反向遍歷,提升某些操作效率。
缺點(diǎn)
1.隨機(jī)訪問(wèn)低效
- 必須從頭節(jié)點(diǎn)遍歷,時(shí)間復(fù)雜度 O(n),而數(shù)組通過(guò)索引訪問(wèn)為 O(1)。
2.額外內(nèi)存開(kāi)銷
- 每個(gè)節(jié)點(diǎn)需存儲(chǔ)指針,占用額外空間(尤其是雙向鏈表,每個(gè)節(jié)點(diǎn)多一個(gè)指針)。
3.緩存不友好
- 內(nèi)存非連續(xù)分布,導(dǎo)致 CPU 緩存命中率低,遍歷效率低于數(shù)組。
4.代碼復(fù)雜度
- 需要手動(dòng)管理指針,易出現(xiàn)內(nèi)存泄漏或指針錯(cuò)誤(如雙向鏈表的指針維護(hù))。
不同鏈表類型的對(duì)比
| 類型 | 特點(diǎn) | 適用場(chǎng)景 |
|---|---|---|
| 單向鏈表 | 每個(gè)節(jié)點(diǎn)僅指向下一個(gè)節(jié)點(diǎn),內(nèi)存占用較少 | 簡(jiǎn)單插入/刪除(如棧、LRU緩存) |
| 雙向鏈表 | 支持雙向遍歷,插入/刪除更靈活,但內(nèi)存占用更高 | 頻繁雙向操作(如雙向隊(duì)列) |
| 循環(huán)鏈表 | 尾節(jié)點(diǎn)指向頭節(jié)點(diǎn),形成環(huán),適合周期性操作(如輪詢調(diào)度) | 循環(huán)隊(duì)列、輪詢?nèi)蝿?wù)管理 |
總結(jié)
- 選擇鏈表:需頻繁插入/刪除,且不依賴隨機(jī)訪問(wèn)。
- 選擇數(shù)組:需快速訪問(wèn)元素,或內(nèi)存緊湊性要求高。
- 優(yōu)化方向:結(jié)合哈希表(如設(shè)計(jì) LRU 緩存)可彌補(bǔ)鏈表訪問(wèn)效率問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案
這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Spring?Security放行的接口Knife4j靜態(tài)資源的問(wèn)題小結(jié)
這篇文章主要介紹了Spring?Security使用Knife4j靜態(tài)資源的問(wèn)題小結(jié),項(xiàng)目中使用?Spring?Security?做身份認(rèn)證和授權(quán),使用?Knife4j?做接口調(diào)試,需要?Spring?Security?放行的接口記錄在?RequestMatcherConstant?類中,感興趣的朋友跟隨小編一起看看吧2024-02-02
SpringBoot應(yīng)用的打包和發(fā)布實(shí)現(xiàn)
本文主要介紹了SpringBoot應(yīng)用的打包和發(fā)布實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
使用Java生成和識(shí)別二維碼的簡(jiǎn)易教程
在當(dāng)今瞬息萬(wàn)變的商業(yè)和技術(shù)環(huán)境中,二維碼已成為快速、高效信息傳遞的代名詞,本文將為您介紹 Spire.Barcode for Java 這一強(qiáng)大工具,它能幫助您輕松應(yīng)對(duì)Java應(yīng)用程序中的二維碼生成與識(shí)別挑戰(zhàn),需要的朋友可以參考下2025-09-09
Java策略模式的簡(jiǎn)單應(yīng)用實(shí)現(xiàn)方法
這篇文章主要介紹了Java策略模式的簡(jiǎn)單應(yīng)用實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02

