前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS 算法与数据结构之列表

JS 算法与数据结构之列表

作者头像
Leophen
发布2021-06-01 22:29:09
1.7K0
发布2021-06-01 22:29:09
举报
文章被收录于专栏:Web前端开发

JS 如何创建一个简单的列表类?以下将描述如何实现该抽象数据类型(ADT)

一、 什么是列表

列表是一组有序的数据,每个列表中的数据项称为元素 在 JS 中,列表的元素可以是任意数据类型,且列表保存多少元素没有事先限定 要设计列表的抽象数据类型,我们需要列出列表的属性及方法:

1、列表的属性

属性名

作用

listSize

列表的元素个数

pos

列表的当前位置

length

返回列表中元素的个数

2、列表的方法

方法名

作用

clear

清空列表中的所有元素

toString

返回列表的字符串形式

getElement

返回当前位置的元素

insert

在现有元素后插入新元素

append

在列表的末尾添加新元素

remove

从列表中删除元素

front

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

end

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

prev

将当前位置后移一位

next

将当前位置前移一位

hasNext

判断后一位

hasPrev

判断前一位

currPos

返回列表的当前位置

moveTo

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

二、列表的实现

我们先从定义构造函数开始实现

代码语言:javascript
复制
function List() {
  this.listSize = 0
  this.pos = 0
  this.dataStore = [] // 初始化一个空数组来保存列表元素
  this.clear = clear
  this.find = find
  this.toString = toString
  this.insert = insert
  this.append = append
  this.remove = remove
  this.front = front
  this.end = end
  this.prev = prev
  this.next = next
  this.hasNext
  this.hasPrev
  this.length = length
  this.currPos = currPos
  this.moveTo = moveTo
  this.getElement = getElement
  this.contains = contains
}

1、append 方法

给列表添加元素

代码语言:javascript
复制
function append(element) {
  this.dataStore[this.listSize++] = element
}

当新元素就位后,变量 listSize 加 1

2、find 方法

在列表中查找某一元素

代码语言:javascript
复制
function find(element) {
  for (var i = 0; i < this.dataStore.length; ++i) {
    if (this.dataStore[i] == element) {
      return i
    }
  }
  return -1
}

3、remove 方法

从列表中删除元素

代码语言:javascript
复制
function remove(element) {
  var foundAt = this.find(element)
  if (foundAt > -1) {
    this.dataStore.splice(foundAt, 1)
    --this.listSize
    return true
  }
  return false
}

remove() 方法中使用 find() 方法返回的位置对数组 dataStore 进行截取,数组改变后,将变量 listSize 的值减 1 如果元素删除成功,返回 true,否则返回 false

4、length 方法

返回列表中元素个数

代码语言:javascript
复制
function length() {
  return this.listSize
}

5、toString 方法

显示列表中的元素

代码语言:javascript
复制
function toString() {
  return this.dataStore
}

下面对以上形成的类进行一个简短的测试

代码语言:javascript
复制
var names = new List()

names.append('a')
names.append('b')
names.append('c')
console.log(names.toString()) // ["a", "b", "c"]

names.remove('b')
console.log(names.toString()) // ["a", "c"]

6、insert 方法

向列表中插入一个元素

代码语言:javascript
复制
function insert(element, after) {
  var insertPos = this.find(after)
  if (insertPos > -1) {
    this.dataStore.splice(insertPos + 1, 0, element)
    ++this.listSize
    return true
  }
  return false
}

insert() 方法中使用 find() 方法,寻找传入的 after 参数在列表中的位置,然后使用 splice() 方法将新元素插入该位置,再将变量 listSize 加 1 并返回 true

7、clear 方法

清空列表中所有的元素

代码语言:javascript
复制
function clear() {
  delete this.dataStore
  this.dataStore.length = 0
  this.listSize = this.pos = 0
}

clear() 方法使用 delete 操作符删除数组 dataStore,接着在下一行创建一个空数组,最后一行将 listSizepos 的值设为 1,表明这是一个新的空列表

8、contains 方法

判断给定值是否在列表中

代码语言:javascript
复制
function contains(element) {
  for (var i = 0; i < this.dataStore.length; i++) {
    if (this.dataStore[i] == element) {
      return true
    }
  }
  return false
}

9、遍历列表方法

允许用户在列表上自由移动的方法集合

代码语言:javascript
复制
function front() {
  this.pos = 0
}

function end() {
  this.pos = this.listSize - 1
}

function prev() {
  --this.pos
}

function next() {
  if (this.pos < this.listSize) {
    ++this.pos
  }
}

function currPos() {
  return this.pos
}

function moveTo(position) {
  this.pos = position
}

// 返回列表的当前元素
function getElement() {
  return this.dataStore[this.pos]
}

function hasNext() {
  return this.pos < this.listSize
}

function hasPrev() {
  return this.pos >= 0
}

下面用一个例子来展示这些方法的使用:

1、首先创建一个列表:
代码语言:javascript
复制
var names = new List()

names.append('a')
names.append('b')
names.append('c')
names.append('d')
names.append('e')
2、现在移动到列表中的第一个元素并显示该元素:
代码语言:javascript
复制
names.front()
console.log(names.getElement()) // a
3、接下来往后移动一个单位并显示
代码语言:javascript
复制
names.next()
console.log(names.getElement()) // b
4、prev() 的使用
代码语言:javascript
复制
names.next()
names.next()
names.prev()
console.log(names.getElement()) // c
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 什么是列表
    • 1、列表的属性
      • 2、列表的方法
      • 二、列表的实现
        • 1、append 方法
          • 2、find 方法
            • 3、remove 方法
              • 4、length 方法
                • 5、toString 方法
                  • 6、insert 方法
                    • 7、clear 方法
                      • 8、contains 方法
                        • 9、遍历列表方法
                          • 1、首先创建一个列表:
                          • 2、现在移动到列表中的第一个元素并显示该元素:
                          • 3、接下来往后移动一个单位并显示
                          • 4、prev() 的使用
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档