链表的实现

链表是一个线性结构,同时也是一个天然的递归结构。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

在这里插入图片描述

链表的增删改查

 <script>
      // 链的基本实现
      // 此处声明的是node节点的构造函数
      class Node {
        constructor(v, next) {
          this.value = v;
          this.next = next;
        }
      }
      // 链表的增删改查功能
      class LinkList {
        constructor() {
          // 链表的长度
          this.size = 0;
          // 虚拟的初始头部
          this.virtualHeader = new Node(null, null);
        }
        // 检测索引是否正确
        checkIndex(index) {
          if (index < 0 || index > this.size) throw new Error("Index Error!");
        }
        _find(header, index, currentIndex) {
          if (index === currentIndex) return header;
          return this._find(header.next, index, currentIndex + 1);
        }
        //增加节点
        addNode(val, index) {
          //  思路:当往链表末尾插入时,prev.next 为空
          // 其他情况时,因为要插入节点,所以插入的节点
          // 的 next 应该是 prev.next
          // 然后设置 prev.next 为插入的节点

          //  1 检测index是否合法
          this.checkIndex(index);
          //   找到插入节点的前一个节点
          let prev = this._find(this.virtualHeader, index, 0);
          prev.next = new Node(v, prev.next);
          this.size++;
          // 返回新增加的节点
          return prev.next;
        }
        addToFirst(val) {
          this.addNode(val, 0);
        }
        addToLast(val) {
          this.addNode(val, this.getSize());
        }
        //插入节点
        insertNode(val, index) {
          this.addNode(val, index);
        }
        //删除节点
        delNode(index, isLast) {
          this.checkIndex(index);
          //删除最后一个节点的index是index-1
          index = isLast ? index - 1 : index;
          let prev = this._find(this.virtualHeader, index, 0);
          let node = prev.next; //找到当前的节点
          prev.next = node.next;
          node.next = null;
          this.size--;
          return node;
        }
        delFirstNode() {
          return this.delNode(0);
        }
        delLastNode() {
          return this.delNode(this.size, true);
        }
        // 查询节点
        getNode(index) {
          this.checkIndex(index);
          // 非空判断
          if (this.isEmpty()) return;
          return this._find(this.virtualHeader, index, 0).next;
        }
        // 非空判断
        isEmpty() {
          return this.getSize() === 0;
        }
        // 获取链表的长度
        getSize() {
          return this.size;
        }
      }
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值