JavaScript链表---单向链表

简介

链表是由一组节点组成的集合,每个节点都有一个对象的引用指向下一个节点。指向下一个节点的引用叫做

在这里插入图片描述

data中保存数据,next保存下一个节点的引用。我们可以看到链表的尾元素指向null,表示结束。

由于链表的头结点确定起来很麻烦,由此我们又引入了头结点,来表示链表的头部。

有头结点的链表

实现

首先我们定义一个Node类来表示节点。从图中可以看出,Node类中需要包含两个属性:

  1. element: 用来保存节点上的数据
  2. next: 用来保存指向下一个节点的链接
class Node {
  constructor(element) {
    this.element = element; // 当前节点数据
    this.next = null; // 下一个节点的链接
  }
}

我们再定义一个LinkedList类来提供操作链表的一些方法,LinkedList 中只有一个头节点属性。


class LList {
  constructor() {
    this.head = new Node("head"); // 头节点
  }

  /**
   * 显示链表
   */
  display() {}

  /**
   * 查找节点
   * @param {*} item  给定节点
   */
  find(item) {}

  /**
   * 
   * @param {*} item 给定节点
   * @param {*} newElement 插入的新节点
   */
  insert(item, newElement) {}

  /**
   * 查找前一个节点
   * @param {*} item  给定节点
   */
  findPrev(item) {}

  /**
   * 删除节点
   * @param {*} item 
   */
  remove(item) {}
}

查看链表

定义一个方法,打印出链表的值,遍历链表,直到next为null。


  display() {
    let currentNode = this.head;
    while (currentNode !== null) {
      console.log(currentNode.element);
      currentNode = currentNode.next;
    }
  }

头节点 next 的初始值是 null,插入新元素后next指向新元素。

想要完成在一个给定节点后插入一个新节点,第一步需要找到这个给定节点。

查找节点

从链表头节点开始查找,遍历链表。


  find(item) {
    let currentNode = this.head;
    while (currentNode !== null && currentNode.element !== item) {
      currentNode = currentNode.next;
    }
    return currentNode;
  }

查找到节点之后,就可以在之后插入新节点了。

插入节点

将新节点的next指向给定节点原本的next,给定节点next指向新节点。
在这里插入图片描述


  insert(item, newElement) {
    let newNode = new Node(newElement);
    let oldNode = this.find(item);
    newNode.next = oldNode.next;
    oldNode.next = newNode;
  }

下面我们来看看方法是否正确:


let fruits = new LList();

fruits.insert("head", "Apple");
fruits.insert("Apple", "Banana");
fruits.insert("Banana", "Pear");

fruits.display();

输出:
在这里插入图片描述

查找前一个节点

想要删除一个节点需要找到他的前一个节点

  findPrev(item) {
    let currentNode = this.head;
    while (currentNode !== null && currentNode.next.element !== item) {
      currentNode = currentNode.next;
    }
    return currentNode;
  }
删除节点

将需要删除的前一个节点的next指向删除节点的next
在这里插入图片描述


  remove(item) {
    let prevNode = this.findPrev(item);
    if (prevNode.next !== null) {
      prevNode.next = prevNode.next.next;
    }
  }

下面我们再验证一下删除功能:

fruits.remove("Apple");
fruits.display();

输出:
在这里插入图片描述

点击查看源码,在线试一试

快捷入口

JavaScript链表—双向链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值