链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
//链表:火车
//每一列不仅携带自己的乘客(item) 还要与下一节火车相连(next)
var LinkedList =function(){
//链表头
var head =null //null :object类型只不过是空的
//链表长度
var length=0 //初始长度
//辅助类:节点
var Node =function(element){
this.element=element
this.next=null
}
//链表尾添加元素
this.append=function(element){
var node =new Node(element)
//node ={
// element:element,
// next:null
// }
if(head ==null){
head =node
}else{
var current=head
while(current.next){
current=current.next
}
//while循环结束之后 current已经到了链表最后一项
current.next =node
}
length++
}
//指定位置添加元素
this.insert =function(position,element){
//越界
if(position>-1&&position<length){
var node =new Node(element)
if(position ==0){
var current =head
head =node
head.next=current
}else{
var index=0
var current =head
var previous=null
while(index<position){
previous =current
current=current.next
index++
}
previous.next =node
node.next=current
}
length++
}else{
return false
}
}
//移除数组
this.removeAt =function(position){
if(position>-1&&position<length){
var index=0
var current=head
if(position==0){
head =current.next
}else{
while(index<position){
previous =current
current =current.next
index++
}
previous.next=current.next
}
length--
return current
}
return null
}
//获取某个元素的位置
this.indexOf =function(element){
var current =head
var index=0
while(current){
if(element==current.element){
return index
}
current =current.next
index++
}
return -1
}
//移除某个元素
this.remove =function(element){
var index =this.indexOf(element)
return this.removeAt(index)
}
//检查是否为空
this.isEmpty =function(){
return length==0
}
//长度
this.size =function(){
return length
}
//获得链表头
this.getHead =function(){
return head
}
}
var l =new LinkedList()
console.log(l.getHead())
l.append(1)
l.append(2)
l.append(3)
l.append(4)
// l.remove(0)
// console.log(l.removeAt(1))
// console.log(l.indexOf(8))
console.log(l.remove(3))
console.log(l.getHead())
console.log(l.isEmpty())
console.log(l.size())