js中的数据结构之列表

js中的数据结构之列表

一、定义

列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合,在这种数据结构上进行的基本操作包括对元素的的查找、插入和删除等。

二、描述

列表是一组有序的数据,每个列表中的数据项称为元素 。

列表中的元素可以是任意数据类型。

列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。

列表中可以使用一个变量listSize 保存列表中元素的个数, 可以在列表末尾append 一个元素,也可以在一个给定元素后或列表的起始位置insert 一个元素。使用remove方法从列表中删除元素,使用clear 方法清空列表中所有的元素等等。除了这些方法外我们还可以根据自己项目中的业务需要封装其他各种各样的方法。

不像其他语言如python,在JavaScript中是没有列表这个数据结构的,但是数组array和列表非常的相似,所以我们可以根据array封装一个列表类。

三、属性和方法描述

1、listSize

列表的元素的个数。

2、pos

列表当前的位置

3、clear

清空列表

4、getCurrentElement

获取当前位置的元素

5、insert

在现有元素后插入新元素

6、append

在列表的末尾添加新元素

7、remove

从列表中删除元素

8、front

将列表的当前位置设移动到第一个元素

9、end

将列表的当前位置移动到最后一个元素

10、prev

将当前位置后移一位

11、next

将当前位置前移一位

12、moveTo

将当前位置移动到指定位置

13、find

在列表中查找指定元素,查找到就返回次元素所在位置,否则返回-1

14、contains

判断一个值是否在列表中

三、代码实现

class List {
  constructor() {
    this.dataStore = [];
    this.listSize = 0;
    this.pos = 0;
  }

  // 列表末位添加元素,同时将个数+1
  append(element) {
    this.dataStore[this.listSize++] = element;
  }

  // 查找指定元素
  find(element) {
    for (let index = 0; index < this.dataStore.length; index++) {
      if (this.dataStore[index] === element) return index;
    }
    return -1;
  }

  // 删除指定元素,同时元素长度 -1
  remove(element) {
    const elementIndex = this.find(element);
    if (elementIndex !== -1) {
      this.dataStore.splice(elementIndex, 1);
      // eslint-disable-next-line no-plusplus
      --this.listSize;
      return true;
    }
    return false;
  }

  // 向指定元素后插入元素(可多个),同时更新列表个数
  insert(targetElement, ...after) {
    const elementIndex = this.find(targetElement);
    if (elementIndex !== -1) {
      this.dataStore.splice(elementIndex + 1, 0, ...after);
      this.listSize += after.length;
      return true;
    }
    return false;
  }

  // 查找当前元素是否在列表中
  contains(element) {
    for (let index = 0; index < this.dataStore.length; index++) {
      if (this.dataStore[index] === element) return true;
    }
    return false;
  }

  // 当前位置移到列表第一位
  front() {
    this.pos = 0;
  }

  // 当前位置移到列表最后一位
  end() {
    this.pos = this.listSize - 1;
  }

  // 当前位置前移一位
  prev() {
    if (this.pos > 0) --this.pos;
  }

  // 当前位置后移一位
  next() {
    if (this.pos < this.listSize - 1) ++this.pos;
  }

  // 移动到列表指定位置
  moveTo(position) {
    this.pos = position;
  }

  // 获取当前位置元素
  getCurrentElement() {
    return this.dataStore[this.pos];
  }
  
  // 清空列表
  clear() {
    this.dataStore = [];
    this.listSize = 0;
    this.pos = 0;
  }
}

四、测试

const list = new List();
list.append(0);
list.append(1);
list.append(2);
list.append(3);
list.append(6);
console.log(list.dataStore, list.listSize, '当前值'); // [0, 1, 2, 3, 6] 5 '当前值'
list.insert(3, 4, 5);
console.log(list.dataStore, list.listSize, '插入后的值'); // [0, 1, 2, 3, 4, 5, 6] 7 '插入后的值'
list.next();
list.next();
list.next();
console.log(list.pos, list.getCurrentElement(), '向后移动后的值'); // 3 3 '向后移动后的值'
list.prev();
console.log(list.pos, list.getCurrentElement(), '移动后的值'); //  2 2 '移动后的值'
list.remove(4);
list.remove(5);
console.log(list.dataStore, list.listSize, '删除后的值'); // [0, 1, 2, 3, 6] 5 '-删除后的值'
console.log(list.contains(6), list.contains(5)); // true false
list.clear();
console.log(list.dataStore, list.pos, list.listSize, '清空后的值'); // [] 0 0 '清空后的值'
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值