Javascript實現列表結構
作者原文:http://hawkzz.com/blog/blog/1514966479779
簡介
最近,在看《數據結構與算法 Javascript描述》,本篇文章,只是看書的筆記,算是重復造輪子;覺得有用的可以看看,覺得無用的,勿噴;
定義
列表是一組有序的數據,每個列表中的數據項稱為元素,在Javascript中,列表中的元素可以是任意數據類型。不包含任何元素的列表稱為空列表。
列表的抽象數據類型定義
抽象數據類型 | 定義 |
---|---|
listSize(屬性) | 列表的元素個數 |
pos(屬性) | 列表的當前位置 |
length(屬性) | 返回列表中的元素個數 |
clear(方法) | 清空列表中的所有元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回當前位置的元素 |
insert(方法) | 在現有的元素後插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 從列表中刪除元素 |
find(方法) | 從列表中查找元素的位置 |
front(方法) | 將列表的當前位置移到第一個元素 |
end(方法) | 將列表的當前位置移到最後一個元素 |
prev(方法) | 將當前位置前移一位 |
next(方法) | 將當前位置後移一位 |
currPos(方法) | 返回列表的當前位置 |
moveTo(方法) | 將當前位置移到到指定位置 |
contains(方法) | 從列表中查找元素是否存在 |
列表類的實現
1、創建List類
定義List構造函數,根據定義的列表抽象數據類型,創建一個List類
function List() { this.dataList = []; this.listSize = 0; this.pos = 0; this.len = length; this.clear = clear; this.toString = toString; this.getEle = getEle; this.insert = insert; this.append = append; this.remove = remove; this.find = find; this.front = front; this.end = end; this.prev = prev; this.next = next; this.currPos = currPos; this.moveTo = moveTo; this.contains = contains }
2、給列表添加元素:append
function append(ele) { //添加元素
this.listStze += 1;
this.dataList[this.listSize - 1] = ele;
}
該方法往列表裏添加元素,先將列表擴容,然後添加元素;
3、查詢列表元素的位置:find
function find(ele){
for(var i = 0; i < this.listSize; i++ ){
if(ele === this.dataList[i]){
return i;
}
}
return -1;
}
該方法查找元素的位置,如果找到就返回該元素的位置,否則就返回-1;
4、刪除列表元素:remove
function remove(ele) { //刪除元素
var index = this.find(ele);
if (index > -1) {
this.dataList.splice(index, 1);
this.listSize -= 1;
return true;
}
return false;
}
該方法刪除列表元素,首先通過find()方法查詢是否存在該元素,如果存在這獲取其下標,通過splice()刪除該元素;並且列表長度減1;
5、查詢元素是否存在:contains
function contains(ele){
var index = this.find(ele);
if (index > -1) {
return true;
}
return false;
}
6、插入元素:insert
function insert(ele, after) { //插入元素
var index = this.find(after);
if (index > -1) {
this.dataList.splice(index + 1, 0, ele);
this.listSize += 1;
}else{
this.append(ele);
}
}
改方法實現往某個元素後面插入一個元素,首先使用find()方法查詢在列表中是否存在after元素,如果存在就在after元素後面,插入ele元素;如果不存在,就在列表最後面插入;
7、查詢列表長度:length
function length() { //列表長度
return this.listSize;
}
8、清空列表:clear
function clear() { //清空列表
delete this.dataList;
this.dataList = [];
this.pos = 0;
return true;
}
該方法清空列表,首先刪除舊的列表,然後創建新的列表,指針重置為0;
9、獲取當前位置的元素;getEle;
function getEle() {
return this.dataList[this.pos];
}
10、設置當前位置為開頭:front
function front() { //設置當前位置是0
this.pos = 0;
}
11、設置當前位置是最後一個元素的位置:end
function end() {
this.pos = this.listSize - 1;
}
12、設置指針向前移一位:prev
function prev() {
if (this.pos > 0) {
this.pos -= 1;
} else {
this.front();
}
}
13、設置指針向後移一位:next
function next() { //設置當前位置向後移動
if (this.pos < this.listSize - 1) {
this.pos += 1;
} else {
this.pos = this.end();
}
}
14、獲取當前指針的位置:currPos
function currPos() { //返回當前位置
return this.pos;
}
12、移動當指定位置:moveTo
function moveTo(position) { //移動當指定位置
if (position >= 0 && position <= this.listSize - 1) {
this.pos = position;
return true;
}
return false;
}
13、列表循環
首先,創建列表;
var list = new List();
然後,向列表導入數據
var arr = ['a','b','c','d','e'];
for(var i = 0;i < arr.length ; i ++){
list.append(arr[i]);
}
接著,循環列表
for(list.front;list.currPos < list.length(); list.next()){
console.log(list.getEle());
}
或者
for(list.end();list.currPos >= 0 ; list.prev()){
console.log(list.getEle());
}
Javascript實現列表結構