简介
上一篇介绍了单向链表,我们发现从链表的头部通过next向后遍历链表很简单,但是从后向前遍历却不容易。既然我们可以把下一个节点存起来,那也可以定义一个prev属性,来指向上一个节点,这样就形成了双向链表
实现
首先在Node类中增加一个prev属性
class Node {
constructor(element) {
this.element = element; // 当前节点数据
this.next = null; // 下一个节点的链接
this.prev = null; // 上一个节点的链接
}
}
插入节点
将新节点的next指向给定节点的next,新节点的prev指向给定节点
将给定节点next的prev指向新节点指向新节点,给定节点的next指向新节点
insert(item, newElement) {
let newNode = new Node(newElement);
let currNode = this.find(item);
newNode.next = currNode.next;
newNode.prev = currNode;
if (currNode.next) {
currNode.next.prev = newNode;
}
currNode.next = newNode;
}
删除节点
将需要删除节点的prev的next指向需要删除节点的next
将需要删除节点的next的prev指向需要删除节点的prev
remove(item) {
let currNode = this.find(item);
if (currNode.prev !== null) {
currNode.prev.next = currNode.next;
}
if (currNode.next !== null) {
currNode.next.prev = currNode.prev;
}
currNode.next = null;
currNode.prev = null;
}