什么是链表
- 看似火车~
- 特点:链表里的每一项除了包含自己的信息外,还包含有下一项(next)的数据内容。
- 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的每个元素有一个存储元素本身的节点和一个指向下一个元素的引用组成。
- 数据结构:
{element:'元素内容', next:null}
,next指向下一项(实现需要借助一个辅助类)
链表的操作
以下以单向链表为例:
特点:每个节点(node)都由数据本身和一个指向后续节点的指针组成
整个链表的存取必须从头指针开始,头指针指向第一个节点
最后一个节点的指针指向空(NULL)
- 操作
- 获取元素索引:indexOf
- 尾部添加元素:append
- 插入元素:insert(position,element)
- 从链表中移除一项:remove(element)
- 从链表中特定位置移除一项:removeAt(positon)
- 是否为空:isEmpty
var LinkedList = function(){
// 链表头
var head = null
// 链表长度
var length = 0
// 辅助类
var Node = function(elem){
this.elem = elem
this.next = null
}
// 添加元素
this.append = function(el){
var node = new Node(el)
if(head===null){
head = node
}else{
var current= head;
while(current.next){
current = current.next
}
current.next=node
}
length ++;
}
// 插入
this.insert = function(position,element){
var current = head
var node = new Node(element)
if(position===0){
head = element
head.next = current
}else{
var index = 0
var previous= null
while(index<position){
previous = current
current = current.next
index++
}
previous.next = node
node.next = current
}
length ++
}
// 删除
this.removeAt = function(position){
if(position>-1&&position<length){
// 删除首位
if(position===0){
var current = head
head = current.next
}else{
// 删除其他位置
var previous = null
var current = head
var index = 0
while(index<position){
previous=current
current = current.next
index++
}
// 跳出循环时,index === position
previous.next = current.next
}
}
length --;
return current
}
// 获取元素位置
this.indexOf = function (ele){
var index =0
var current = head
while(current){
if(ele === current.elem){
return index
}
index ++
current = current.next
}
return -1
}
this.remove = function(elem){
return this.removeAt(this.indexOf(elem))
}
this.isEmpty = function(){
return length ===0
}
this.size = function(){
return length
}
this.printHead = function(){
console.log(head)
}
}
var l = new LinkedList()
l.append(1)
l.append(2)
l.append(3)
l.insert(1,6)
l.printHead()
加强链表
双向链表
- 特点:含有previous指向上一项,next指向下一项,
循环链表
- 特点:链表尾部指向链表头
- 应用场景:轮播图