列表是一组有序的数据。每个列表的数据称为元素,列表中可以保存多少元素没有事先限定,实际使用时元素的数量受到程序内存的限制。
实现列表类
根据抽象数据类型,可以实现一个 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.length = length; // 返回列表中的元素个数
this.currPos = currPos; // 返回列表的当前位置
this.moveTo = moveTo; // 将当前位置移动到指定位置
this.getElement = getElement; // 显示当前元素
this.contains = contains; //判断给定值是否在列表中
}
append:给列表添加元素
方法 append() 给列表的下一个位置增加一个新的元素,这个位置刚好等于变量 listSize 的值,当新元素就位后,变量 listSize 加 1。
function append(element) {
this.dataStore[this.listSize++] = element;
}
find :在列表中查找元素
find() 方法通过对数组对象进行 dataStore 进行迭代,查找给定的元素。如果找到,就返回该元素在列表中的位置,否则返回 -1。
function find(element) {
for (var i = 0; i < this.dataStore.length; i++) {
if (this.dataStore[i] = element) {
return i;
}
}
return -1;
}
remove:从列表中删除元素
实现从列表中删除一个元素,首先需要在列表中找到该元素,然后删除它,并且调整底层的数组对象填充删除该元素后留下的空白。
remove() 方法使用 find() 方法返回的位置对数组 dataStore 进行截取。数组改变后,将变量 listSize 的值减 1,以反映列表的最新长度。若成功删除元素,返回 true,否则返回 false。
function remove(element) {
var foundAt = this.find(element);
if (foundAt > -1) {
this.dataStore.splice(foundAt, 1);
this.listSize--;
return true;
}
return false;
}
length:列表中有多少元素
function length() {
return this.listSize;
}
toString:显示列表中的元素
function toString() {
return this.dataStore;
}
insert:向列表中插入一个元素
insert() 方法需要知道将元素插入到什么位置,可以假设插入是指插入到列表中某个元素之后。
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;
}
clear:清空列表中所有的元素
clear() 方法使用 delete 操作符删除 dataStore,接着在下一行创建一个空数组。最后一行将 listSize 和 Pos 的值设为 0,表示这是一个新的空列表。
function clear() {
delete this.dataStore;
this.dataStore = [];
this.listSize = this.pos = 0;
}
constains:判断给定值是否在列表中
function contains(element) {
for (var i = 0; i < this.dataStore.length; i++) {
if (this.dataStore[i] == element) {
return true;
}
}
return false;
}
遍历列表
以下这些方法允许在列表中移动。
function front() {
this.pos = 0;
}
function end() {
this.pos = this.listSize - 1;
}
function prev() {
if (this.pos > 0) {
this.pos--;
}
}
function next() {
if (this.pos < this.listSize - 1) {
this.pos++;
}
}
function currPos() {
return this.pos;
}
function moveTo(position) {
this.pos = position;
}
function getElement() {
return this.dataStore[this.pos];
}
参考资料:
JavaScript高级程序设计
JavaScript MDN
Data Structures and Algorithms with JavaScript