- 双向链表
function DoubelLinkedList() {
let Node = function (ele){
this.ele = ele;
this.prev = null;
this.next = null;
}
let length = 0, head = null;
// 向尾部追加
this.append = function(ele) {
let node = new Node(ele),
current, previous;
if(!head) {
head = node;
} else {
current = head;
while(current) {
previous = current;
current = current.next;
}
previous.next = node;
node.prev = previous;
}
length++;
return true;
}
// 插入到指定的位置
this.insert = function(position, ele) {
if(position >= 0 && position < length) {
let node = new Node(ele),
current = head, previous, index = 0;
if(position == 0) {
if(!head) {
head = node;
} else {
node.next = head;
head.prev = node;
head = node;
}
} else {
while(index++ < position) {
previous = current;
current = current.next;
}
if(position != length) {
node.next = current;
current.prev = node;
}
previous.next = node;
node.prev = previous;
}
length++;
return true;
} else {
return false;
}
}
// 删除值为 ele 的元素
this.removeAt = function(ele) {
let current = head, previous, num = 0;
if(current.ele == ele) {
head = head.next;
}
previous = current;
current = current.next;
while(current) {
if(current.ele == ele) {
previous.next = current.next;
if(current.next) {
current.next.prev = previous;
}
current = current.next;
length--;
num++;
} else {
previous = current;
current = current.next;
}
}
return num;
}
// 删除尾部
this.remove = function() {
if(length == 0) {
return false;
}
let current = head, previous;
if(length == 1) {
head = null;
length--;
return current.ele;
}
while(current.next) {
previous = current;
current = current.next;
}
previous.next = null;
length--;
return current.ele;
}
// 获取当前元素的位置
this.indexOf = function(ele) {
let current = head, index = 0;
while(current && index < length) {
if(current.ele == ele) {
return index;
}
current = current.next;
index++;
}
return false;
}
// 是否为空
this.isEmpty = function() {
return length == 0;
}
// 链表长度
this.size = funciton() {
return this.length;
}
// 获取链表的值 toString
this.toString = function() {
let current = head, str;
while(current) {
str = str +current.ele + ' ';
current = current.next;
}
return str;
}
// 获取头结点
this.getHead = function() {
return head.ele;
}
// 获取尾部结点
this.getTail = function() {
let current = head, previous;
while(current) {
previous = current;
current = current.next;
}
return previous.ele;
}
}
- 双向循环链表
概念:将双向链表的头尾指针相连即可。
特点:该链表可以从任意的一个节点的两个方向进行遍历。