JavaScript真的需要鏈表嗎?


javaScript可以原生提供的數據類型的確有限,但是並不代表不需要。
從一開始只有Object、Array到現在增加的Map和Set也確實證明前端也在不斷發展自己的數據結構。
下邊就有些沒有的數據結構進行模擬實現。

java中鏈表的必要性

Java內部有自己的鏈表結構的數據類型LinkedList
為什么要有鏈表這種存儲結構呢?
因為在java中,java數組存在弊端,ArrayList倒是解決了部分弊端(支持動態自動擴容)。
但是 LinkedList則以鏈表的形式進行存儲,會有其它好處,以下是對比

鏈表 數組
內存占用 不需要連續的內存空間 需要連續的內存空間
大小可變 鏈表的大小可動態變化 數組大小固定,不能動態擴展
增刪 較快,只需要修改前一個元素的指針即可 較慢,需要移動修改元素只有的所有元素
查詢 較慢,只能遍歷查找 較快,可以通過下標直接訪問
在訪問方式上 必須是順序訪問,不能隨機訪問 可以隨機訪問其中的元素
空間的使用上 可以隨意擴大 不能

鏈表是有data和指向下一個數據的指針地址兩部分組成

數組是有下標索引和data兩部分組成

數組和鏈表都是線性表的結構,只不過它們的存儲方式不一樣
根據存儲方式不同,可將線性表分為順序表和鏈式表;
數組:在內存中,是一塊連續的內存區域;
鏈表:是由不連續的內存空間組成;


參考:鏈接1鏈接2

JavaScript不需要鏈表

了解過鏈表的同學應該都知道,鏈表有幾個特點:
1、可以動態擴展空間(在js中,數組本來是這樣的,但是有的語言中數組的長度是固定的,不能動態添加,如c、java語言)
2、需要一個頭節點
3、需要知道下一個節點的地址

因為數組結構的局限性,所以才會有鏈表結構的存儲方式。
那么這些局限性,在JavaScript中是不存在的。我們看看MDN怎么說的?

數組是一種類列表對象,它的原型中提供了遍歷和修改元素的相關操作。
JavaScript 數組的長度和元素類型都是非固定的。
因為數組的長度可隨時改變,並且其數據在內存中也可以不連續,所以 JavaScript 數組不一定是密集型的,這取決於它的使用方式。
一般來說,數組的這些特性會給使用帶來方便,但如果這些特性不適用於你的特定使用場景的話,可以考慮使用類型數組 TypedArray

要問一個問題。
有誰知道JS的Array底層到底是個什么東西?
它具備棧的用法,push pop,加上unshift shift又是一個queue
又具備splice功能(鏈表擅長的)
但隨機訪問又具備O(1)的保證(真實array?hashmap?)

主要還是JS是門解釋型&&高級上層語言,你所想寫的東西底層體現的不一定是完完全全的數據結構思想體現。所寫內容的性能實際受到的影響因素太多了。
換種問法好了,Array.prototype.sort底層采用的排序方案是什么?每款引擎每個年代都是同一種方案嗎?

所以從前端數據結構角度(面向面試編程),鏈表是一個重要的算法、數據結構考點,實際使用實在是鮮有機會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM