javascript資料結構-雙鏈表
阿新 • • 發佈:2021-01-05
**
javascript資料結構雙鏈表
**
今天我們來講一下雙鏈表,相對於單鏈表來說,他多了一個指向前邊的節點的指標
我們先來封裝一個函式來初始化雙鏈表
function doubleLinkedList(){
//封裝一個內部的函式
function node(data){
this.data=data
this.next=null
this.prev=null
}
//再來定義雙鏈表的一些屬性
this.head=null
this.length=0
//然後再來新增一些方法
doubleLinkedList. prototype.insert=function(data,position){
if(position<0|| position>this.length) return false
//如果雙鏈表為空,那麼就直接新增進去,讓頭節點等於這個節點
var newnode=new node(data)
if(this.length===0){
this.head=newnode
}else {
//若果插入的是第一個位置,
//就把它和第一個節點連線起來,再讓頭節點等於這個新的節點
if(position===0){
this.head.prev=newnode
newnode. next=this.head
this.head=newnode
}
//如果插入的地方是最後一個,那麼找到最後一個節點,把它接到最後一個
else if(position === this.length){
var current=this.head
while(current.next){
current=current.next
}
/*到這裡,current已經是最後一個節點了
這裡迴圈條件是當current.next為true的時候,因為如果是
current的話,他找到最後一個,他此時為true,他還會往下再走一次
就會變成null,所以這裡是current.next*/
current.next=newnode
newnode.prev=current
}else {
var index=0
var current=this.head
while(index<position){
current=current.next
index+=1
}
//到這裡,current指向的那個節點的位置是要被插入的位置
newnode.prev=current.prev
newnode.next=current
current.prev.next=newnode
current.prev=newnode
}
}
this.length+=1
return true
}
//然後就是刪除結點的操作
doubleLinkedList.prototype.remove=function(position){
//如果輸入的位置不正確,返回false
if(position<0 || position>this.length-1) return false
//如果連結串列已經為空,返回null
if(this.length===0){
this.head=null
this.next=null
return null
}
else {
//如果刪除的位置是0的話,
//那麼讓頭節點等於第二個節點,再把頭結點前邊的節點刪除掉
if(position===0){
this.head=this.head.next
this.head.prev=null
}
//如果刪除的是最後一個節點
else if(position === this.length-1){
var current=this.head
while(current.next){
current=current.next
index+=1
}
//到這一步,current是整個連結串列的最後一個節點,讓他往前走一個
//也就是倒數第二個,再讓current.next等於空,就刪除了最後一個節點
current.prev.next=null
}
//其他的情況
else {
var index=0
var current=this.head
while(index<position){
current=current.next
index+=1
}
current.prev.next=current.next
current.next.prev=current.prev
}
}
this.length-=1
return true
}
//3.輸出整個連結串列的資料
doubleLinkedList.prototype.getelements=function(){
//最終我們以陣列的方式返回這個所有的資料
var arry=[]
var current=this.head
while(current){
arrt.push(current.data)
current=current.next
}
return arry
}
//4.得到某個位置上的資料
doubleLinkedList.prototype.getEle=function(position){
if(position<0 || position>this.length-1) return false
var index=0
var current=this.head
while(index<position){
index+=1
current=current.next
}
return current.data
}
//5.查詢某個資料的位置,不存在返回-1,反之返回位置
doubleLinkedList.prototype.indexOf=function(data){
var index=0
var current=this.head
while(current){
if(current.data===data){
return index
}else {
current=current.next
index+=1
}
}
return -1
}
//注意:以上方法只會返回第一個符合條件的資料,如果要全部都得到的話,就需要修改
//在以上條件下,得到所有的位置
doubleLinkedList.prototype.indexOfAll=function(data){
var index=0
var current=this.head
var arry=[]
//要得到所有的,你就要迴圈查詢所有的節點值,如果相等就放置在陣列中去
while(index<this.length){
if(current.data===data){
arry.push(index)
}
index+=1
current=current.next
}
return arry
}
}
常用的就暫時這麼多,然後我們就來測試一下效果
var dou=new doubleLinkedList()
dou.insert(0,0)
dou.insert(1,1)
dou.insert(2,2)
dou.insert(8,1)
dou.insert(0,0)
console.log(dou.getelements())
結果為
再來測試其他的幾個方法
console.log(dou.indexOf(8))
console.log(dou.indexOfAll(0))
console.log(dou.getEle(3))
結果為
然後再來測試remove的方法
console.log(dou.getelements())//輸出刪除前的結果
dou.remove(0)
dou.remove(3)
console.log(dou.getelements())//輸出刪除後的結果
結果為
雙鏈表就到此結束了,下次分享其他的資料結構型別,本人小菜鳥一個大家可以一起討論,覺得有用的小夥伴就點個贊吧!!!