連結串列的作用和好處?如何用JS來寫一個連結串列

Nothlu發表於2019-03-28

連結串列是一種資料結構,裡面的每個元素都包含下一個元素的位置資訊,和陣列做個對比,陣列在記憶體中存放需要一段連續的位置,而陣列則不用,可以分開儲存在記憶體的任意位置。

這樣做的好處是插入和刪除速度快,步驟少,如果要在頭部插入一個新的元素,連結串列只需要將第一個元素的位置資訊新增進新的元素裡即可,操作步驟為O(1),而陣列則需要將裡面所有的元素都往後移一位,步驟為O(n)。

壞處在於查詢很慢,在連結串列裡如果要找到某個元素,必須從第一個開始,順藤摸瓜式地往下查詢。 所以,連結串列通常用在插入和刪除比較多的場景,比如記賬軟體和代辦事項等。

現在,就用js來建立一個連結串列,實現連結串列的所有功能:

1.元素類 首先要有一個建立元素的類,這個元素包含了兩個資訊,一個是當前元素,另一個是下個元素的資訊:

var Node = function(e){
    this.element = e
    this.next = null
}
複製程式碼

2.連結串列類 其次要建立一個連結串列類,裡面包含一個head和連結串列長度,當創立一個新的連結串列類時,連結串列裡的head也會通過元素類來建立一個新的元素,這個新元素的element和next都是空的,建立的目的是將它作為第一個元素,因為無論是查詢或者插入,都需要從第一個元素找起:

var LinkedList = function(){
    this.head = new Node()
    this._length = 0
}
複製程式碼

3.Append 如果要插入一個元素的話,首先將要插入的元素建立一個新的node,然後判斷head的next元素是否為空,如果不為空的話,可以提取head.next,這樣就獲得了下一個元素,然後接著判斷,一直到空為止; 當next為空後說明到了最後一鏈,此時將之前建立的node賦值給next,然後給計數器加1,如:

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則輸出,如:

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 列印所有連結串列所有元素,如:

LinkedList.prototype.log = function(){
    var n = this.head.next
    while (n != null){
	log('>', n.element)
	n = n.next
    }
}
複製程式碼

完整程式碼:

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
    }
}
複製程式碼

相關文章