学习js数据结构与算法-链表(4)

129 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。

第十四天:继续了解链表

  • 双向链表

    双向链表和之前写的普通链表(单向链表)的区别在于,在链表中,一个节点只有指向下一个节点的链接;而双向链表链接是双向的,一个指向下一个元素,一个指向上一个元素,就像下面这个图一样。

image.png

  • 那它的节点类就得改变了,可以继承单向链表的节点类

     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
    }
    

    首先还是边界的判断,然后进入第一种情况,第一种情况是插入到第一个位置,插入到第一个位置也有两种情况,一种是双向链表是空的,空的时候,只需要将头指针和尾指针都指向这个新节点就好;一种是双向链表不为空,这个时候需要将新节点指向第一个节点、头指针指向新节点。具体操作可以看下面这个图

image.png

第二种情况是在尾部插入新节点。在尾部插入新节点,我们需要将最后一个指针的尾指针指向新节点,新节点的头指针指向最后一个指针,尾指针这个时候就得指向这个新的节点了,具体的操作可以看下面这个图

image.png

最后一种情况就是在中间去插入新节点了,这个操作就比较多了,我们首先要先根据索引找到当前节点和上一个节点,需要将上一个节点的尾指针指向新节点,新节点的头指针指向上一个节点,新节点的尾指针指向当前节点,当前节点的头指针指向新节点。具体的操作可以看这个图

image.png