链表结构是我们在面试中经常会被问起的较为基础的数据结构问题,起初学习数据结构使用的是C++语言,最近在做前端面试题的过程中没碰到了需要用js实现双链表的需求,百度出来的文章发现可很多错误,于是索性自己重新写了,并且列出了一些错误点,这里给大家较为详细的一步步看一下实现思想和步骤,相较于C++语言,js的实现可以说是很简单了,不需要创建繁琐的对象,更加直观易懂;
首先我们来看一下双向链表的结构图:
每个结点包含三部分,指向前一个结点的指针(pre),指向后一个节点的指针(next),以及自己的数据部分(element),于是我们就可以先写出结点对象
function Node
:定义结点对象
function Node(element) {
this.element = element
this.next = null
this.previous = null
}
然后我们开始实现插入链表的算法
(声明)下面函数中的this是我们最后初始化链表的实例,这里大家不要疑惑。可以拉到最下面我们初始化链表那里,相信你会明白呦
**`function insert`:插入节点**function insert(newelement, currentelement) {
var newNode = new Node(newelement)
var currentNode = this.find(currentelement)
if (currentNode === 'error') {
console.log('无法插入,要插入节点不存在')
return
}
if (currentNode.next != null) {
newNode.next = currentNode.next
currentNode.next = newNode
newNode.previous = currentNode
newNode.next.previous = newNode
} else {
currentNode.next = newNode
newNode.previous = currentNode
}
}
function find
:找到插入位置
function find(element) {
var currentNode = this.head
while (currentNode.element != element) {
/*如果找到最后一个节点还没有找到我们的插入点,那么我们就会返回错误*/
if (currentNode.next == null) {
console.log('can not find this node; maybe not have this node')
return 'error'
}
currentNode = currentNode.next
}
return currentNode
}
接下来是移除结点的实现,如果看懂了插入节点的实现,那么移除就会很简单了,相信大家都可以很快明白,这里就直接贴出实现代码;
function remove
:移除一个结点
function remove(element) {
var currentNode = this.find(element)
if (currentNode === 'error') {
console.log('要移除节点不存在')