「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
我个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。
第十四天:继续了解链表
-
双向链表
双向链表和之前写的普通链表(单向链表)的区别在于,在链表中,一个节点只有指向下一个节点的链接;而双向链表链接是双向的,一个指向下一个元素,一个指向上一个元素,就像下面这个图一样。
-
那它的节点类就得改变了,可以继承单向链表的节点类
class DoublyNode extends Node { constructor(element, next, prev) { super(element, next); this.prev = prev; } }链表类也可以继承单向链表的类
class DoublyLinkedList extends LinkedList { constructor() { super(); this.tail = null; } } -
在任意位置插入一个新节点
双向链表的插入和单项链表的又不一样了, 需要考虑的东西就多了。
function insert(element, 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 = current current.prev = node this.head = node } }else if(index === this.count){ current = this.tail current.next = node node.prev = current this.tail = node }else { previous = this.getElementAt(index-1) current = previous.next node.next = current previous.next = node current.prev = node node.prev = previous } this.count++ return true } return false }首先还是边界的判断,然后进入第一种情况,第一种情况是插入到第一个位置,插入到第一个位置也有两种情况,一种是双向链表是空的,空的时候,只需要将头指针和尾指针都指向这个新节点就好;一种是双向链表不为空,这个时候需要将新节点指向第一个节点、头指针指向新节点。具体操作可以看下面这个图
第二种情况是在尾部插入新节点。在尾部插入新节点,我们需要将最后一个指针的尾指针指向新节点,新节点的头指针指向最后一个指针,尾指针这个时候就得指向这个新的节点了,具体的操作可以看下面这个图
最后一种情况就是在中间去插入新节点了,这个操作就比较多了,我们首先要先根据索引找到当前节点和上一个节点,需要将上一个节点的尾指针指向新节点,新节点的头指针指向上一个节点,新节点的尾指针指向当前节点,当前节点的头指针指向新节点。具体的操作可以看这个图