鏈表是一種數據結構,裏面的每一個元素都包含下一個元素的位置信息,和數組作個對比,數組在內存中存放須要一段連續的位置,而數組則不用,能夠分開存儲在內存的任意位置。javascript
這樣作的好處是插入和刪除速度快,步驟少,若是要在頭部插入一個新的元素,鏈表只須要將第一個元素的位置信息添加進新的元素裏便可,操做步驟爲O(1),而數組則須要將裏面全部的元素都日後移一位,步驟爲O(n)。java
壞處在於查找很慢,在鏈表裏若是要找到某個元素,必須從第一個開始,順藤摸瓜式地往下查找。 因此,鏈表一般用在插入和刪除比較多的場景,好比記帳軟件和代辦事項等。node
如今,就用js來建立一個鏈表,實現鏈表的全部功能:數組
1.元素類 首先要有一個建立元素的類,這個元素包含了兩個信息,一個是當前元素,另外一個是下個元素的信息:數據結構
var Node = function(e){
this.element = e
this.next = null
}
複製代碼
2.鏈表類 其次要建立一個鏈表類,裏面包含一個head和鏈表長度,當創立一個新的鏈表類時,鏈表裏的head也會經過元素類來建立一個新的元素,這個新元素的element和next都是空的,建立的目的是將它做爲第一個元素,由於不管是查找或者插入,都須要從第一個元素找起:app
var LinkedList = function(){
this.head = new Node()
this._length = 0
}
複製代碼
3.Append 若是要插入一個元素的話,首先將要插入的元素建立一個新的node,而後判斷head的next元素是否爲空,若是不爲空的話,能夠提取head.next,這樣就得到了下一個元素,而後接着判斷,一直到空爲止; 當next爲空後說明到了最後一鏈,此時將以前建立的node賦值給next,而後給計數器加1,如:this
LinkedList.prototype.append = function(){
var node = new Node()
var n = this.head
while (n.next != null){
n = n.next
}
n.next = node
this._length++
}
複製代碼
4.Indexof 返回鏈表某個元素的位置,和append差很少,一樣是從第一個開始不斷尋找,每次尋找都會對比元素,若是返回true則輸出,如:spa
LinkedList.prototype.indexof = function(e){
var n = this.head
for (let i = 0; i < this._length; i++){
//由於第一個鏈表元素是空的,因此不須要對比,直接跳到下一個
n = n.next
if (n.element == e){
return i
}
}
}
複製代碼
5.Log 打印全部鏈表全部元素,如:prototype
LinkedList.prototype.log = function(){
var n = this.head.next
while (n != null){
log('>', n.element)
n = n.next
}
}
複製代碼
完整代碼:code
var Node = function(e){
this.element = e
this.next = null
}
var LinkdeList = function(){
//當建立一個新的鏈表時,裏面會包含一個空的鏈數
this.head = new Node()
this._length = 0
}
LinkdeList.prototype.append = function(e){
var node = new Node(e)
var n = this.head
while(n.next != null){
n = n.next
}
n.next = node
this._length++
}
LinkdeList.prototype.indexof = function(e){
var n = this.head
for (let i = 0; i < this._length; i++) {
n = n.next
if (n.element == e){
return i
}
}
}
LinkdeList.prototype.log = function(){
var n = this.head.next
while(n != null){
log('>',n.element)
n = n.next
}
}
複製代碼