列表是一组有序的数据,每个数组中的数据项称为元素。数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型。列表中可以保存不定数量的元素,实际使用时元素的数量受到程序内存的限制。
本文将介绍如何创建一个简单的列表类,将根据给出的列表抽象数据类型定义,实现该抽象数据类型,在列表详解(下)中,将分析几个适合解决的实际问题。
listSize(属性) | 列表的元素个数 |
pos(属性) | 列表当前位置 |
length(属性) | 返回列表中元素的个数 |
clear(方法) | 清空列表中所有的元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回当前位置的元素 |
insert(方法) | 在现有元素后插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 从列表中删除元素 |
front(方法) | 将列表的当前位置移动到第一个元素 |
end(方法) | 将列表的当前位置移动到最后一个元素 |
prev(方法) | 将当前位置后移一位 |
next(方法) | 将当前位置前移一位 |
hasNext(方法) | 判断是否存在后一位 |
hasPrev(方法) | 判断是否存在前一位 |
currPos(方法) | 返回列表的当前位置 |
moveTo(方法) | 将当前位置移动到指定的位置 |
根据上边定义的列表抽象数据类型,可以直接实现一个List类。首先我们实现一个构造函数,并声明属性、方法。
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 = hasNext
this.hasPrev = hasPrev
this.length = length
this.currPos = currPos
this.moveTo = moveTo
this.getElement = getElement
this.contains = contains
}
function append(element) {
console.log(this)
this.dataStore[this.listSize++] = element
}
当调用此方法添加元素时,变量listSize加1。
function find(element) {
for (var i = 0; i < this.dataStore.length; i++) {
if (this.dataStore[i] == element) {
return i
}
}
return -1
}
如果找到指定元素则返回该元素的索引,如果没找到,则返回-1
实现原理:借助2.1中实现的find(),查找如需要删除的元素的索引,找到后借助数组方法splice(),删除指定的元素。
function remove(element) {
var foundAt = this.find(element)
if (foundAt > -1) {
this.dataStore.splice(foundAt, 1)
this.listSize--
return true
}
return false
}
function length() {
return this.listSize
}
function toString() {
return this.dataStore.toString()
}
function insert(element, after) {
var insertPos = this.find(after)
if (insertPos > -1) {
this.dataStore.splice(insertPos + 1, 0, element)
this.liseSize++
return true
}
return false
}
function clear() {
delete this.dataStore
this.dataStore.length = 0
this.listSize = 0
this.pos = 0
}
function contains(element) {
for (var i = 0; i < this.dataStore.length; i++) {
return true
}
return false
}
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 hasNext() {
return this.pos < this.listSize
}
function hasPrev() {
return this.pos >= 0
}
function getElement() {
return this.dataStore[this.pos]
}
在控制台新建一个List对象,往列表添加元素
开始测试:
(1)从前到后遍历列表
var tList = new List()
tList.append('哈哈1')
tList.append('哈哈2')
tList.append('哈哈3')
tList.append('哈哈4')
tList.append('哈哈5')
for (tList.front(); tList.hasNext(); tList.next()) {
console.log(tList.getElement())
}
结果:
(2)从后到前遍历列表
var tList = new List()
tList.append('哈哈1')
tList.append('哈哈2')
tList.append('哈哈3')
tList.append('哈哈4')
tList.append('哈哈5')
for (tList.end(); tList.hasPrev(); tList.prev()) {
console.log(tList.getElement())
}
结果:
JavaScript数据结构与算法——列表详解(上)完结
有错误欢迎指出,谢谢。下篇将分析一下列表适合解决的实际问题。
晚安~~