鏈表

我們要存儲(chǔ)一個(gè)有序的對(duì)象列表,正常的選擇會(huì)是一個(gè)數(shù)組:

let arr = [obj 1, obj 2, obj 3]

但是用數(shù)據(jù)有個(gè)問題。"刪除元素"和"插入元素"的操作代價(jià)很大,arr.unshift(obj)操作必須對(duì)所有元素重新編號(hào)以便為新的元素ojb出空間,如果數(shù)組很大,會(huì)耗費(fèi)大量時(shí)間。此時(shí)我們可以選擇另一種叫做鏈表的數(shù)據(jù)結(jié)構(gòu)。

鏈表元素?是一個(gè)使用以下元素通過遞歸定義的對(duì)象:

let list = {

? ? value: 1,

? ? next: {

? ? ? ? value: 2,

? ? ? ? next: {

? ? ? ? ? ? value: 3

? ? ? ? ? ? next: null

????????}

????}

}

注:value為當(dāng)前鏈表元素的值,next屬性引用下一個(gè)鏈表元素或者代表末尾的null。

一段用來創(chuàng)建鏈表的代碼:

let list = { value: 1 };

list.next = { value: 2 };

list.next.next = { value: 3 };

list.next.next.next = null;

從上面的代碼我們可以清楚地看到,這里有很多個(gè)對(duì)象,每一個(gè)都有value和指向鄰居的next。變量list是鏈表中的第一個(gè)對(duì)象,因此順著next指針,我們可以抵達(dá)任何元素。

比如,將新值添加到鏈表頭部

list = { value: "new item", next: list }

要從中間刪除一個(gè)值,可以修改前一個(gè)元素的next:

list.next = list.next.next

我們讓?list.next?從?1?跳到值?2?,F(xiàn)在值?1?就被從鏈表中移除了。如果它沒有被存儲(chǔ)在其它任何地方,那么它會(huì)被自動(dòng)從內(nèi)存中刪除。

鏈表和數(shù)組對(duì)比

與數(shù)組不同,鏈表沒有大規(guī)模重排,我們可以很容易地重新排列元素。鏈表主要的缺點(diǎn)就是我們無法很容易地通過元素的編號(hào)獲取元素。但在數(shù)組中卻很容易:arr[n]?是一個(gè)直接引用。而在鏈表中,我們需要從起點(diǎn)元素開始,順著?next?找?N?次才能獲取到第 N 個(gè)元素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容