双链表的概念:
双链表也叫双向链表,是链表的一种,它的每个数据结点中除了本身的元素节点还有两个指针,分别指向直接后继和直接前驱。所以,从双链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。双链表的结构如下图所示:
双链表的特点:
- 每个数据节点除了本身的元素节点之外,还有两个指针,分别指向直接后继节点和直接前驱结点
- 从链表中添加或者删除节点不需要移动其他的节点
- 双链表提供了两种迭代列表的方法,可以从头到尾也可以从尾到头,也可以访问一个特点节点的下一个或者前一个节点。
js定义双链表和一些基本的方法:
首先定义一个类似类的结构来表示双链表,在该结构中定义声明一些基本的属性,代码如下:
//定义双链表
function DoublyLinkedList() {
//定义双链表的一些属性
let Node = function (element) {
this.element = element;
this.next = null;
this.prev = null;
};
let length = 0;
let head = null;
let tail = null;//双链表有个尾巴
}
同时在该类中定义一些基本的方法,代码如下:
//定义一些基本的方法
//在某位置插入一个元素
this.insert = function (position, element) {
//检查越界
if (position >= 0 && position <= length){
let node = new Node(element);
//current表示当前的项的变量
let current = head,
previous,index = 0;
if (position === 0){//要插入的位置是第一个位置
if (!head){//当前双链表是空链表,插入的元素成为链表的第一个元素
head = node;
tail = node;
} else {//当前链表不为空,要插入的元素成为第一个元素
node.next = current;
current.prev = node
head = node;
}
} else if (position === length){//要插入的位置是最后一个位置
current = tail;
current.next = node;
node.prev = current;
tail = node;
} else {//要插入的位置是任意的一个位置
while (index++ < position){//从双链表的头部开始查找,找到要插入的位置
previous = current;
current = current.next;
}
//找到要插入的位置了,开始插入元素
node.next = current;
previous.next = node;
current.prev = node;
node.prev = previous;
}
length++;
return true;
} else {
return false;
}
}
//从任意位置移除元素
this.removeAt = function (position) {
//检查越界值
if (position > -1 && position < length){
let current = head;
let previous , index = 0;
if (position === 0) {//要移除的是第一项
head = current.next;
//如果链表只有一项,则移除第一项之后,还要更新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){
//从头开始遍历,找到要移除的位置
previous = current;
current = current.next;
}
//将previous与current的下一项链接起来---跳过current
previous.next = current.next;
current.next.prev = previous;
}
length--;
return current.element;
} else {
return null;
}
}
//输出双链表中的元素
this.toString = function (){
let current = head,
string = '',
indexCheck = 0;
while (current && indexCheck < length){
string += current.element + (current.next ? '-':'');
current = current.next;
indexCheck++;
}
return string;
}
使用双链表:
定义一个双链表,并在特定位置插入两个元素,输出双链表,然后再删除某位置上的元素,代码如下:
let doubleList = new DoublyLinkedList();
doubleList.insert(0,'12');
doubleList.insert(1,'33');
doubleList.insert(2,'56');
console.log(doubleList.toString());//输出12-33-56
console.log(doubleList.removeAt(0));//输出12
console.log(doubleList.toString());//输出33-56
还有一些其他的方法,参照单链表,这里就不赘述了。