双向链表和普通链表的区别在于,双向链表链接是双向的,一个链向上一个元素,一个链向下一个元素。
所以一个元素应该是:
node = function(element){
this.element = element
this.prev = null// 指向上一个
this.next = null// 指向下一个
}
同时不仅包括head,还应该有tail,记录最后一个元素,
let head = null
let tail = null
let length = 0
2 方法实现
2.1在任意位置插入新元素和移除新元素
function DoublyLinkedList(){
let Node = function(element){
this.element = element
this.prev = null
this.next = null
}
let head = null
let tail = null
let length = 0
this.insert = function (position,element){
if(position>=0&&position<=length){// 考虑临界情况
let node = new Node(element),
current = head,
prev,
index = 0
if(position==0){
if(!head){
head = node
tail = node
}else{
node.next = current // node变成了head
current.prev = node // 之前的head变成了node的下项
head = node // 赋值
}
}else if(position==length){
current = tail //保存tail的值
current.next = node //tail的next指向node
node.prev = current //node的prev指向之前的tail
tail = node //将最后一个值保存为tail
}else{
while(index<position){
prev = current //保存现任值
current = current.next// 现任变前任,后任继位
index++ //索引值增加
}
prev.next = node
node.prev = prev
node.next = current
current.prev = node
}
length++
return node
}else{
return null
}
}
//在任意位置移除元素
this.remove = function(position){
if(position>=0&&position<=length-1){
let current = head,index =0,prev
if(position==0){
current = current.next
head = current
// 还需要改变prev 和 tail
if(length ===1){
tail = null
}else{
head.prev = null
}
}else if(position ==length-1){
current = tail
tail = current.prev
tail.next =null
}else{
while(index<position){
prev = current
current = current.next
index++
}
prev.next = current.next
current.next.prev =prev
}
length --
return current
}else{
return null
}
}
//打印head
this.print = function(){
console.log(head)
}
}
网友评论