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

125 阅读1分钟

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

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

第十六天:继续了解链表

  • 循环链表

    循环列表基本的改动也就一个,就是最后的节点的尾指针不再指向null,而是指向第一个节点,下面我们就实现一下单项循环链表的插入吧

    • 在任意位置插入节点
    function insert(element, index) {
      if(index >= 0 && index <= this.count) {
        const node = new Node(element)
        let current = this.head
        if(index === 0) {
          if(this.head === null) {
            this.head = node
            node.next = this.head
          }else {
            node.next = current
            current = this.getElementAt(this.size())
            this.head = node
            current.next = this.head
          }
        }else {
          previous = this.getElementAt(index - 1)
          node.next = previous.next
          previous.next = node
        }
        this.count++
        return true
      }
      return false
    }
    

    还是和之前的一样,先处理边界情况,然后就是进行插入,单项链表的循环链表只有两种情况,一种是插入第一个节点。另一种就是插入其他任意位置了。

    首先我们看看插入第一个位置,插入第一个位置也有两种情况,一种是当前单项循环链表是空的,没有长度,那么需要将头指针指向当前节点,然后将当前节点的next指向头指针。具体操作可以看下面的图

image.png

第二种插入头部的情况就是当前单项虚幻链表不是空的,这个就复杂一点,我们需要找到最后一个节点,然后将当前节点的next指向第一个节点,最后一个节点的next这个时候指向当前的节点。头指针指向当前节点。具体操作可以看下面的图。

image.png

另一种情况是在任意位置插入,前面的都有处理最后一个节点的情况,为什么这个单项循环链表就没有了呢?是因为最后一个的操作和中间任意位置的操作都是一样的。需要先找到插入那个位置的节点的上一个节点,然后将当前节点的next指向上一个节点的next,然后上一个节点的next指向当前节点即可,这样就完成了。

  • 在任意位置移除节点

    要从循环链表中移除节点,我们只需要考虑第二种情况,也就是修改循环链表的头指针

    function removeAt(index) {
      if(index >= 0 && index >= this.count) {
        let current = this.head
        if(index === 0) {
          if(this.size() === 1) {
            this.head = null
          }else {
            const removed = this.head
            current = this.getElementAt(this.size() - 1)
            this.head = remove.next
            current.next = this.head
            current = removed
          }
        }else {
          const previous = this.getElementAt(index)
          current = previous.next
          previous.next = current.next
        }
        this.count++
        return current.element
      }
    	return null
    }
    

    首先还是对边界值的判断。

    然后就是看当删除的节点是第一个节点时的操作,如果当前的单向循环链表的长度只有一个,那么只需要让头指针指向null

    如果当前单向循环列表的长度不止一个,那么就需要找到最后一个指针,将最后一个指针的next指向需要移除节点的next指向的节点,头指针也指向需要移除节点的next指向的节点,下面的图展示具体的操作

image.png