JS實現單向鍊錶 雙向鍊錶 迴圈鍊錶

2022-07-16 07:06:08 字數 3732 閱讀 1649

鍊錶儲存有序的元素的集合,但是和陣列不同的是,鍊錶中的元素在記憶體中的儲存並不是連續的。每乙個鍊錶元素都包含了乙個儲存元素本身的節點乙個指向下乙個元素的引用。看起來就像這樣:

相對於傳統的陣列,鍊錶的乙個好處就是增刪的時候無需移動其它元素,只要更改指標的指向就可以了。但是缺點就是如果想要訪問鍊錶中的元素,需要從頭開始迴圈迭代到你想要的元素。

function linkedlist() 

let length = 0

let head = null

// 向鍊錶尾部追加元素

let node = new node(element)

let current

if (head === null) else

current.next = node // 給最後一項賦值

}length++ // 更新列表的長度

}// 從鍊錶中移除指定位置元素

this.removeat = function (position) else

previous.next = current.next // 將previous與current的下一項連線起來,跳過current,從而移除

}length-- // 更新列表的長度

return current.element

} else

}// 在鍊錶任意位置插入乙個元素

this.insert = function (position, element) else

node.next = current // 在previous與current的下一項之間插入node

previous.next = node

}length++

return true

} else

}// 把鍊錶內的值轉換成乙個字串

this.tostring = function ()

return string

}// 在鍊錶中查詢元素並返回索引值

this.indexof = function (element)

index++

current = current.next

}return -1

}// 從鍊錶中移除指定元素

this.remove = function (element)

this.isempty = function ()

this.size = function ()

this.gethead = function ()

}let list = new linkedlist()

console.log(list.tostring()) // 1 2

list.insert(0, 'hello')

list.insert(1, 'world')

console.log(list.tostring()) // hello world 1 2

list.remove(1)

list.remove(2)

console.log(list.tostring()) // hello world

單鏈表有乙個變種 - 迴圈鍊錶,最後乙個元素指向下乙個元素的指標,不是引用null,而是指向第乙個元素,只需要修改下最後的next指向為head即可。

雙向鍊錶與單鏈表的區別在於,在單鏈表中,乙個節點只有鏈向下乙個節點的鏈結,而在雙向鍊錶中,鏈結是雙向的:乙個鏈向下乙個元素,另乙個鏈向前乙個元素。

雙向鍊錶提供了兩種迭代列表的方法:從頭到尾,或則反過來。在單鏈表中,如果我們在迭代列表中錯過了要找的元素,就需要回到列表的起點,重新開始迭代,這是雙向列表的優點。

雙向鍊錶與單向鍊錶的實現類似,需要同時控制next、prev兩個指標,同時需要增加尾引用tail。

function doublelinkedlist() 

let length = 0

let head = null

let tail = null // 新增乙個尾引用

// 向鍊錶尾部追加元素

let node = new node(element)

let current

if (head === null) else

current.next = node // 給最後一項賦值

node.prev = current

tail = node // 修改尾引用

}length++ // 更新列表的長度

}// 從鍊錶中移除指定位置元素

this.removeat = function (position) else

} else if (position === length - 1)

else

previous.next = current.next // 將previous與current的下一項連線起來,跳過current,從而移除

current.next.prev = previous

}length-- // 更新列表的長度

return current.element

} else

}// 在鍊錶任意位置插入乙個元素

this.insert = function (position, element) else

node.next = current

head = node

} else if (position === length) else

node.next = current // 在previous與current的下一項之間插入node

previous.next = node

current.prev = node

node.prev = previous

}length++

return true

} else

}// 把鍊錶內的值轉換成乙個字串

this.tostring = function ()

return string

}// 在鍊錶中查詢元素並返回索引值

this.indexof = function (element)

index++

current = current.next

}return -1

}// 從鍊錶中移除指定元素

this.remove = function (element)

this.isempty = function ()

this.size = function ()

this.gethead = function ()

}let list = new doublelinkedlist()

console.log(list.tostring()) // 1 2

list.insert(0, 'hello')

list.insert(1, 'world')

console.log(list.tostring()) // hello world 1 2

list.remove(1)

list.remove(2)

console.log(list.tostring()) // hello world

鍊錶(單向鍊錶,雙向鍊錶)

首先鍊錶是以節點的方式儲存資料的,每個節點包含資料域 data 節點域 next 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...

單向鍊錶和雙向鍊錶區別 雙向鍊錶

一開始確實被這個雙向鍊錶整暈了,node裡面不停套node,簡直無限套娃,讓人不知道該怎麼下手。後來看了資料結構與演算法分析這本書的 才算整明白。我把鍊錶分成了三個部分 第一部分是node.node是乙個由兩根指標,以及我們需要儲存的資料構成的結構體。這個node就是無限套娃的起源,也是鍊錶用於儲存...

單向鍊錶he雙向鍊錶

鍊錶 linked list 是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在每乙個節點裡存到下乙個節點的指標 pointer 在電腦科學中,鍊錶作為一種基礎的資料結構可以用來生成其它型別的資料結構。鍊錶通常由一連串節點組成,每個節點包含任意的例項資料 data fie...