链表是一种数据结构,里面的每一个元素都包含下一个元素的位置信息,和数组作个对比,数组在内存中存放须要一段连续的位置,而数组则不用,能够分开存储在内存的任意位置。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
}
}
复制代码