链表的做用和好处?如何用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
    }
}
复制代码
相关文章
相关标签/搜索