在这里我们会继承上一篇文章封装单向链表里面的类,在这就不重复写了,大家可以直接点击查看就好了,开始封装。
// 双向链表的节点
class DoublyNode extends Node {
constructor(element) {
super(element);
this.prev = null;
}
}
// 双向链表
class DoublyLinkedList extends LinkList {
constructor() {
super();
this.tail = null;
}
push(element) {
const node = new DoublyNode(element);
if (this.head === null) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
node.prev = this.tail;
this.tail = node;
}
this.count++;
}
insert(index) {
if (index >= 0 && index <= this.count) {
const node = new DoublyNode(element);
let current = this.head;
if (index === 0) {
if (this.head === null) {
this.head = node;
this.tail = node;
} else {
node.next = this.head;
this.head.prev = node;
this.head = node;
}
} else if (index === this.count) {
current = this.tail;
current.next = node;
node.prev = current;
this.tail = node;
} else {
const previous = this.getNodeAt(index - 1);
current = previous.next;
node.next = current;
current.prev = node;
previous.next = node;
node.prev = previous;
}
this.count++;
return true
}
return false
}
removeAt(index) {
if (index >= 0 && index < this.count) {
let current = this.head;
if (index === 0) {
this.head = current.next;
if (this.count === 1) {
this.tail = null;
} else {
this.head.prev = undefined
}
} else if (index === this.count - 1) {
current = this.tail;
this.tail = current.prev;
this.tail.next = undefined;
} else {
let previous = this.getNodeAt(index - 1);
current = previous.next;
previous.next = current.next;
current.next.prev = previous;
}
this.count--;
return current.element
}
return
}
getHead() {
return this.head;
}
getTail() {
return this.tail;
}
}