1. 程式人生 > 其它 >javascript資料結構-雙鏈表

javascript資料結構-雙鏈表

技術標籤:資料結構js資料結構連結串列js

**

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())//輸出刪除後的結果

結果為在這裡插入圖片描述
雙鏈表就到此結束了,下次分享其他的資料結構型別,本人小菜鳥一個大家可以一起討論,覺得有用的小夥伴就點個贊吧!!!