1. 程式人生 > >Javascript實現列表結構

Javascript實現列表結構

for rpo 字符 list() 如果 重復 任意數據類型 down 設置

作者原文: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實現列表結構