目录
3.toString()方法、forwardtoString()方法、backwardtoString()方法
一、初识双向链表
之前阐述过链表的基本实现,此处的链表指的是单向链表,具体参考以下博客内容:
单向链表只能从头遍历到尾或者从尾遍历到头(一般从头到尾),也就是说链表相连的过程是单向的。单向链表实现的原理是上一个链表中有一个指向下一个的引用。
但是,单向链表有一个比较明显的缺点:我们可以轻松的到达下一个节点,但是回到前一个节点是很难的。在实际开发中,经常会遇到需要回到上一个节点的情况。为了解决这个问题,就需要使用双向链表。
双向链表既可以从头遍历到尾,又可以从尾遍历到头,也就是说链表相连的过程是双向的。它的实现原理是一个节点既有向前连接的引用,也有一个向后连接的引用。
双向链表的缺点是每次在插入或删除某个节点时,需要处理四个引用,而不是两个。实现起来麻烦一些,并且相对于单向链表,占用内存空间更大一些。
双向链表的特点:
- 可以使用一个head和一个tail分别指向头部和尾部的节点
- 每个节点由三部分组成:前一个节点的指针(prev)、保存的元素(item)、后一个节点的指针(next)
- 双向链表的第一个节点的prev是null
- 双向链表的最后的节点的next是null
二、双向链表的封装
//封装双向链表
function DoublyLinkedList() {
//属性
this.head = null
this.tail = null
this.length = 0
}
//内部类:节点类
function Node(data) {
this.data = data
this.prev = null
this.next = null
}
三、双向链表的常见操作及实现
1.双向链表中常见的操作
- append(element):向列表尾部添加一个新的项
- insert(position, element):向列表的特定位置插入一个新的项。
- get(position):获取对应位置的元素
- indexOf(element):返回元素在列表中的索引。如果列表中没有该元素则返回-1
- update(position, element):修改某个位置的元素
- removeAt(position):从列表的特定位置移除一项。
- remove(element):从列表中移除一项。
- isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false。
- size():返回链表包含的元素个数。与数组的length属性类似。
- toString():由于列表项使用了Node类,就需要重写继承自JavaScript的对象默认的toString方法,让其只输出元素的值
- forwardString():返回正向遍历的节点