詳解JavaScript中怎么實現(xiàn)鏈表
JavaScript中怎么實現(xiàn)鏈表?
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的的鏈表和樹時,會遇到節(jié)點(node)這個詞,節(jié)點是處理數(shù)據(jù)結(jié)構(gòu)的鏈表和樹的基礎(chǔ)。節(jié)點是一種數(shù)據(jù)元素,包括兩個部分:一個是實際需要用到的數(shù)據(jù);另一個存儲下一個節(jié)點位置。
鏈表是一系列節(jié)點串聯(lián)形成的數(shù)據(jù)結(jié)構(gòu),鏈表存儲有序的元素集合,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。每個元素由一個存儲元素本身的部分和一個指向下一個元素的鏈接部分組成。因此鏈表增刪非首尾元素時不需要移動元素,只需要更改鏈接部分的值即可。
在此僅看單鏈表,單鏈表每個節(jié)點的結(jié)構(gòu)如下:

單鏈表,在這種類型的數(shù)據(jù)結(jié)構(gòu)中,任何兩個數(shù)據(jù)元素之間只有一個鏈接,參見下圖:

鏈表的操作包括了創(chuàng)建、刪除、插入、輸出等。
創(chuàng)建就是空間的分配,將頭、尾指針及鏈表結(jié)點個數(shù)等初始化。刪除和插入根據(jù)被操作元素的位置可以細(xì)分為頭刪除(插入),尾刪除(插入),中間刪除(插入)。
插入操作
頭插入實際上是增加一個新節(jié)點,然后把新增加的結(jié)點指針指向原來頭指針指向的元素,再把頭指針指向新增的節(jié)點。

尾插入也是增加一個新節(jié)點,該節(jié)點指針置為null,然后把原尾結(jié)點指針指向新增加的節(jié)點,最后把尾指針指向新增加的節(jié)點即可。

中間插入稍復(fù)雜,首先增加一個節(jié)點,然后新增節(jié)點的指針指向插入位置的后一個節(jié)點,把插入位置的前一個節(jié)點指針指向新插入節(jié)點即可。

刪除操作
刪除頭元素時,先將頭指針指向下一個節(jié)點,然后把原頭結(jié)點的指針置空即可。

刪除尾元素時,首先找到鏈表倒數(shù)第2個元素,然后把尾指針指向這個元素,接著把原倒數(shù)第2個元素的指針置空。

刪除中間元素相對復(fù)雜一些,首先將要刪除的節(jié)點的前一個節(jié)點指針指向要刪除的節(jié)點的下一個節(jié)點,然后把要刪除節(jié)點的指針置空。

上面提到是單鏈表最基本的操作,除此之外還有其它操作不多說了。下面給出代碼示例。
在 JavaScript中,我們怎么實現(xiàn)鏈表呢?
現(xiàn)在以單鏈表的建立和遍歷為例介紹。項目結(jié)構(gòu)如下

SingleLinkedList.js文件內(nèi)容如下:
//定義單向鏈表的節(jié)點類
class Node{
constructor(data){
this.data = data //節(jié)點的數(shù)據(jù)部分
this.next = null //節(jié)點的鏈接部分(指針部分)
}
}
//定義單向鏈表類
class SingleLinked{
constructor(){
this.size = 0 //單鏈表的長度,用來記錄鏈表中的節(jié)點個數(shù),為一個空鏈表
this.head = new Node('head') //是鏈表的頭指針:記錄鏈表的起始地址
this.currentNode = '' //用來記錄當(dāng)前節(jié)點
}
//獲取鏈表的長度
getLength(){
return this.size
}
//判斷鏈表是否為空
isEmpty(){
return this.size === 0 //如果this.size為0則說明鏈表為空,即返回true
}
//遍歷鏈表:不重復(fù)的訪問鏈表中的每一個節(jié)點
displayList(){
var list = ''
var currentNode = this.head //指向鏈表的頭指針
while(currentNode){ //若當(dāng)前節(jié)點不為空,則執(zhí)行循環(huán)
list+=currentNode.data //連接節(jié)點的數(shù)據(jù)域
currentNode = currentNode.next //讓當(dāng)前指針指向當(dāng)前節(jié)點的下一個節(jié)點
if(currentNode){ //如果currentNode不為空則加上連接符
list += '->' //鏈表節(jié)點的連接符
}
}
console.log(list)
}
//獲取鏈表的最后一個節(jié)點
findLast(){
var currNode = this.head
while(currNode.next){ //若當(dāng)前節(jié)點的next域為空,則他是鏈表的最后一個節(jié)點,跳出循環(huán)
currNode = currNode.next //若當(dāng)前節(jié)點的next域不為空則讓指針指向當(dāng)前節(jié)點的下一個節(jié)點
}
return currNode
}
//采用尾插法給鏈表插入元素
appendNode(element){
var currNode = this.findLast() //找到鏈表的最后一個節(jié)點
var newNode = new Node(element) //創(chuàng)建一個新的節(jié)點
currNode.next = newNode
newNode.next = null
this.size++ //鏈表的長度加1
}
//刪除鏈表中的一個節(jié)點
delete(element){
//this.displayList()
var currentNode = this.head
try{
while((currentNode.next!=null)&&(currentNode.next.element!=element)){ //判斷,如果節(jié)點靠后則節(jié)點的next的next為空,不為空時進行刪除
if(currentNode.next.data === element){
currentNode.next = currentNode.next.next
this.size--
}else{
currentNode = currentNode.next
}
}
}
catch(e){ //測試函數(shù),判斷函數(shù)的運行錯誤
console.log(e)
}
}
}測試代碼內(nèi)容如下,我這里保存文件名為 單鏈表測試.html,將此文件和SingleLinkedList.js放到同一目錄中:
<script src="./SingleLinkedList.js"></script>
<script> //不能寫在有js代碼的JavaScript中
var slist = new SingleLinked()
console.log(slist.isEmpty()) //打印鏈表是否為空,若為空則輸出true
slist.appendNode(1001) //創(chuàng)建鏈表節(jié)點
slist.appendNode(1002) //創(chuàng)建鏈表節(jié)點
//創(chuàng)建鏈表更多節(jié)點
var arr = [1020,1234,1006,788,5512]
for(var i=0;i<arr.length;i++){
slist.appendNode(arr[i])
}
//遍歷輸出鏈表
slist.displayList()
//刪除鏈表中的1006元素
slist.delete(1006)
slist.displayList()
</script>用瀏覽器打開 單鏈表測試.html,按下F12鍵單開控制臺,查看結(jié)果:

以上就是詳解JavaScript中怎么實現(xiàn)鏈表的詳細(xì)內(nèi)容,更多關(guān)于JavaScript實現(xiàn)鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SharePoint 客戶端對象模型 (一) ECMA Script
今天開始SharePoint Client對象模型的介紹,簡而言之,SharePoint通過WCF技術(shù)在服務(wù)端提供數(shù)據(jù)服務(wù),這些服務(wù)提供的內(nèi)容相當(dāng)于SharePoint API的一個子集2011-05-05
Javascript封裝id、class與元素選擇器方法示例
這篇文章主要給大家介紹了Javascript封裝id、class與元素選擇器的方法,文中給出了詳細(xì)的示例代碼,對大家的理解和學(xué)習(xí)具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
js函數(shù)參數(shù)設(shè)置默認(rèn)值的一種變通實現(xiàn)方法
js函數(shù)中有個儲存參數(shù)的數(shù)組arguments,因此js版支持參數(shù)默認(rèn)值的函數(shù)可以通過另外一種變通的方法實現(xiàn)2014-05-05
使用JS組件實現(xiàn)帶ToolTip驗證框的實例代碼
這篇文章主要介紹了使用JS組件實現(xiàn)帶ToolTip驗證框的實例代碼,需要的朋友可以參考下2017-08-08
javascript中定義私有方法說明(private method)
本篇文章主要是對javascript中定義私有方法(private method)進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01

