js优先队列和链表
//封装优先级队列
function PriorityQueue(){
function QueueElement(element,priority){
this.element=element
this.priority=priority
}
//封装属性
this.items=[]
//实现插入方法
PriorityQueue.prototype.enqueue=function(element,priority){
// 1.创建PriorityQueue对象
var queueElement=new QueueElement(element,priority)
//2.判断队列是否为空
if(this.items.length===0){
this.items.push(queueElement)
}else{
var added=false
for(var i=0;i<this.items.length;i++){
if(queueElement.priority< this.items[i].priority){
this.items.splice(i,0,queueElement)
added=true
break
}
}
if(!added){
this.items.push(queueElement)
}
}
}
PriorityQueue.prototype.dequeue=function(){
return this.items.shift()
}
PriorityQueue.prototype.front=function(){
return this.items[0]
}
PriorityQueue.prototype.isEmpty=function(){
return this.items.length===0
}
PriorityQueue.prototype.size=function(){
return this.items.length
}
PriorityQueue.prototype.toString=function(){
var resultString=''
for(var i=0;i<this.items.length;i++){
resultString+=this.items[i].element+'-'+this.items[i].priority+' '
}
return resultString
}
}
//测试代码
var pq=new PriorityQueue
pq.enqueue('abc',111)
pq.enqueue('cab',200)
pq.enqueue('nba',50)
pq.enqueue('nba',66)
alert(pq)
链表的相关方法:
单链表 //分装链表类 function LinkedList(){
//内部的类:节点类
function Node(data){
this.data=data
this.next=null
}
//属性
this.head=null
this.length=0
//1.追加方法
LinkedList.prototype.append=function(data){
//1.创建新的节点
var newNode=new Node(data)
//判断是否添加的是第一个节点
if(this.length===0){ //是第一个节点
this.head=newNode
}else{
//找到最后一个节点
var current=this.head
while(current.next){
current=current.next
}
//最后节点的 next指向新的节点
current.next=newNode
}
//3.lenght +1
this.length+=1
}
//2.toString方法
LinkedList.prototype.toString=function(){
//1.定义变量
var current=this.head
var listString=""
//2.循环获取一个个节点
while(current){
listString+=current.data+ " "
current=current.next
}
return listString
}
//3.insert方法
LinkedList.prototype.insert=function(position,data){
//1.对 position进行越界判读
if(position<0||position>this.length) return false
//2.根据 data 创建newNode
var newNode=new Node(data)
//3.判断插入的位置是否是第一个
if(position===0){
newNode.next=this.head
this.head=newNode
}else{
var index=0
var current=this.head
var previous=null
while(index++<position){
previous=current
current=current.next
}
newNode.next=current
previous.next=newNode
}
//4.length+1
this.length+=1
return true
}
//4.get 方法
LinkedList.prototype.get=function(position){
//1.越界判断
if(position<0||position>=this.length) return null
//2.获取对应的数据
var current=this.head
var index=0
while(index++<position){
current=current.next
}
return current.data
}
//5.indexOf
LinkedList.prototype.indexOf=function(data){
//1.定义变量
var current=this.head
var index=0
//2.开始查找
while(current){
if(current.data===data){
return index
}
current=current.next
index+=1
}
//3.找到最后没有找到,返回-1
return -1
}
//6.update方法
LinkedList.prototype.updated=function(position,newData){
//1.越界判断
if(position<0||position>=this.length) return false
//2.查找正确的节点
var current=this.head
var index=0
while(index++<position){
current=current.next
}
//3.position位置的 node 的 data修改为 newData
current.data=newData
return true
}
//7.removeAt方法
LinkedList.prototype.removeAt=function(position){
//1.越界判断
if(position<0||position>=this.length) return null
//2.判断是否删除的是第一个节点
var current=this.head
if(position===0){
this.head=this.head.next
}else{
var index=0
var previous=null
while(index++<position){
previous=current
current=current.next
}
// 前一个节点的 next指向,current的 next 即可
previous.next=current.next
}
//3.length-1
this.length-=1
return current.data
}
//8.remove方法
LinkedList.prototype.remove=function(data){
//1.获取data在列表中的位置
var position=this.indexOf(data)
//2.根据位置信息删除节点
return this.removeAt(position)
}
//9.isEmpty方法
LinkedList.prototype.isEmpty=function(){
return this.length===0
}
//10.size方法
LinkedList.prototype.size=function(){
return this.length
}
}


双线链表封装:
function DoublyLinkedList(){
//内部类
function Node(data){
this.data=data
this.prev=null
this.next=null
}
//属性
this.head=null
this.tail=null
this.length=0
//常见的操作
//1.append方法
DoublyLinkedList.prototype.append=function(data){
//1.根据 data 创建节点
var newNode=new Node(data)
//2.判断添加的是否是第一个节点
if(this.length===0){
this.head=newNode
this.tail=newNode
}else{
newNode.prev=this.tail
this.tail.next=newNode
this.tail=newNode
}
//3.length+1
this.length+=1
}
//2.将链表转成字符串形式
//2.1 toString方法
DoublyLinkedList.prototype.toString=function(){
return this.backwardString()
}
//2.2forwardString 方法
DoublyLinkedList.prototype.forwardString=function(){
//1.定义变量
var current=this.tail
var resultString=""
//2.依次向前遍历,获取每一个节点
while(current){
resultString+=current.data+" "
current=current.prev
}
return resultString
}
//2.3backwardString 方法
DoublyLinkedList.prototype.backwardString=function(){
//1.定义变量
var current=this.head
var resultString=""
//2.依次向后遍历,获取每一个节点
while(current){
resultString+=current.data+" "
current=current.next
}
return resultString
}
//3.insert 方法
DoublyLinkedList.prototype.insert=function(position,data){
//1.越界判断
if(position<0||position>this.length) return false
//2.根据 data 创建新的方法
var newNode=new Node(data)
//3.判断原来的列表是否为空
if(this.length===0){
this.head=newNode
this.tail=newNode
}else{
if(position===0){
//3.1判断 position是否为空
this.head.prev=newNode
newNode.next=this.head
this.head=newNode
}else if(position===this.length){
//3.2position===this.length
newNode.prev=this.tail
this.tail.next=newNode
this.tail=newNode
}else{
//3.3其他情况
var current=this.head
var index=0
while(index++ < position){
current=current.next
}
//4.修改指针
newNode.next=current
newNode.prev=current.prev
current.prev.next=newNode
current.prev=newNode
}
}
//4.length+1
this.length+=1
return true
}
//4.get 方法
DoublyLinkedList.prototype.get=function(position){
//1.越界判断
if(position<0||position>this.length) return null
//2.获取元素
var current=this.head
var index=0
while(index++<position){
current=current.next
}
return current.data
}
//5.indexOf 方法
DoublyLinkedList.prototype.indexOf=function(data){
//1.定义变量
var current=this.head
var index=0
//2.查找和 data相同的节点
while(current){
if(current.data===data){
return index
}
current=current.next
index+=1
}
return -1
}
//6.update方法
DoublyLinkedList.prototype.update=function(position,newData){
//1.越界判断
if(position<0||position>=this.length) return false
//2.寻找正确的节点
var current=this.head
var index=0
while(index++<position){
current=current.next
}
//3.修改找到节点的 data 信息
current.data=newData
return true
}
//7.removeAt 方法
DoublyLinkedList.prototype.removeAt=function(position){
//1.越界判断
if(position<0||position>=this.length) return null
//2.判断列表中是否只有一个节点
var current=this.head
if(this.length===1){
this.head=null
this.tail=null
}else{
//判断是否删除的是第一个节点
if(position===0){
this.head.next.prev=null
this.head=this.head.next
}else if(position===this.length-1){//最后节点
current=this.tail
this.tail.prev.next=null
this.tail=this.tail.prev
}else{
var index=0
while(index++<position){
current=current.next
}
current.prev.next=current.next
current.next.prev=current.prev
}
}
//3.length-1
this.length-=1
return current.data
}
//8.remove 方法
DoublyLinkedList.prototype.remove=function(data){
//1.根据 data 获取下标值
var index=this.indexOf(data)
//2.根据index 删除对应位置的节点
return this.removeAt(index)
}
//9.isEmpty方法
DoublyLinkedList.prototype.isEmpty=function(){
return this.length===0
}
//10.size方法
DoublyLinkedList.prototype.size=function(){
return this.length
}
//11.获取链表的第一个元素
DoublyLinkedList.prototype.getHead=function(){
return this.head.data
}
//12.获取链表的最后一个元素
DoublyLinkedList.prototype.getTail=function(){
return this.tail.data
}
}
//测试代码
var list=new DoublyLinkedList()
//1.测试 append方法
list.append('abc')
list.append('cba')
list.append('nba')
//2.测试转成字符串的方法
// alert(list)
// alert(list.backwardString())
// alert(list.forwardString())
//3.测试 insert方法
list.insert(0,'aaa')
list.insert(4,'bbb')
list.insert(2,'ccc')
//alert(list)
//4.测试 get 方法
// alert(list.get(0))
// alert(list.get(2))
// alert(list.get(5))
//5.测试 indexOf
// alert(list.indexOf('aaa'))
// alert(list.indexOf('abc'))
// alert(list.indexOf('nba'))
//6.测试 update方法
list.update(0,'mmm')
list.update(1,'nnn')
alert(list)
//7.测试 removeAt 方法
alert(list.removeAt(1))
alert(list)
alert(list.removeAt(0))
alert(list)
//8.测试 remove 方法
alert(list.remove('cba'))
alert(list)
alert(list.remove('nba'))
alert(list)
//9.测试其他方法
alert(list.isEmpty())
alert(list.size())
alert(list.getHead())
alert(list.getTail() )

浙公网安备 33010602011771号