鏈表的做用和好處?如何用JS來寫一個鏈表

鏈表是一種數據結構,裏面的每一個元素都包含下一個元素的位置信息,和數組作個對比,數組在內存中存放須要一段連續的位置,而數組則不用,能夠分開存儲在內存的任意位置。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
    }
}
複製代碼
相關文章
相關標籤/搜索