什麼是鏈表
- 看似火車~
- 特點:鏈表裏的每一項除了包含自己的信息外,還包含有下一項(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指向下一項,
循環鏈表
- 特點:鏈表尾部指向鏈表頭
- 應用場景:輪播圖