連結串列是一種資料結構,裡面的每個元素都包含下一個元素的位置資訊,和陣列做個對比,陣列在記憶體中存放需要一段連續的位置,而陣列則不用,可以分開儲存在記憶體的任意位置。
這樣做的好處是插入和刪除速度快,步驟少,如果要在頭部插入一個新的元素,連結串列只需要將第一個元素的位置資訊新增進新的元素裡即可,操作步驟為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
}
}
複製程式碼