我们现在来学习并掌握双向链表的常见操作!
append操作:
过程详解:
添加节点时分为多种情况:
情况1:添加的是第一个节点:只需要让head和tail都指向新节点即可;
image-20200228094847845
情况2:添加的不是第一个节点,如下图所示:只需要改变相关引用的指向即可。
通过:newNode.prev = this.tail:建立指向1;
通过:this.tail.next = newNode:建立指向2;
通过:this.tail = newNode:建立指向3
要注意改变变量指向的顺序,最后修改tail指向,这样未修改前tail始终指向原链表的最后一个节点。
function DoublyLinkedList() {
//封装内部类:节点类
function Node(data) {
this.data = data;
this.prev =null;
this.next =null;
}
// 属性
this.head =null;
this.tail =null;//tail尾部
this.length =0
// 常见的操作:方法
// 1.append方法
DoublyLinkedList.prototype.append=(data)=>{
// 1.根据data创建节点
let newData=new Node(data)
// 2.判断追加的节点是否是第一个节点
// 原先头部尾部都指向Null,现在追加的节点头部尾部指向新新节点
if(this.length===0){
this.head=newData
this.tail=newData
}else{
newData.prev=this.tail
this.tail.next=newData
this.tail=newData;
}
// 3.length+1
this.length+=1
return true
}
// 2.toString方法
DoublyLinkedList.prototype.toString=()=>{
return this.backwardString()
}
// 3.forwardString方法
DoublyLinkedList.prototype.forwardString=()=>{
// 1.定义变量
let current=this.tail;
let resultString=''
// 2.依次向前遍历,获取每一个节点
while (current){
resultString+=current.data+''
current=current.prev
}
return resultString
}
// 4.backwardString方法
DoublyLinkedList.prototype.backwardString=()=>{
// 1.定义变量
let current=this.head;
let resultString=" "
// 2.依次向后遍历,获取每一个节点
while (current){
resultString+=current.data+' '
current=current.next
}
return resultString
}
}