JavaScript数据结构与算法——列表详解(上)

列表是一组有序的数据,每个数组中的数据项称为元素。数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型。列表中可以保存不定数量的元素,实际使用时元素的数量受到程序内存的限制。

本文将介绍如何创建一个简单的列表类,将根据给出的列表抽象数据类型定义,实现该抽象数据类型,在列表详解(下)中,将分析几个适合解决的实际问题。

1、列表的抽象数据类型定义

listSize(属性)                     列表的元素个数                                                    
pos(属性)  列表当前位置
length(属性)  返回列表中元素的个数
clear(方法)  清空列表中所有的元素
toString(方法)  返回列表的字符串形式
getElement(方法)  返回当前位置的元素
insert(方法)  在现有元素后插入新元素
append(方法)  在列表的末尾添加新元素
remove(方法)  从列表中删除元素
front(方法)  将列表的当前位置移动到第一个元素
end(方法)  将列表的当前位置移动到最后一个元素
prev(方法)  将当前位置后移一位
next(方法)  将当前位置前移一位
hasNext(方法)  判断是否存在后一位
hasPrev(方法)  判断是否存在前一位
currPos(方法)  返回列表的当前位置
moveTo(方法)  将当前位置移动到指定的位置

2、实现列表类

根据上边定义的列表抽象数据类型,可以直接实现一个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
    }

2.1 实现append(),给列表添加元素

    function append(element) {
        console.log(this)
        this.dataStore[this.listSize++] = element
    }

当调用此方法添加元素时,变量listSize加1。

2.2、实现find(),查找列表中的元素

    function find(element) {
        for (var i = 0; i < this.dataStore.length; i++) {
            if (this.dataStore[i] == element) {
                return i
            }
        }
        return -1
    }

如果找到指定元素则返回该元素的索引,如果没找到,则返回-1

2.3、实现remove(),从列表中删除元素

实现原理:借助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
    }

2.4、实现length(),统计列表中的元素

    function length() {
        return this.listSize
    }

2.5、实现toString(),显示列表中的元素

    function toString() {
        return this.dataStore.toString()
    }

2.6、实现insert(),向列表插入一个元素

  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
    }

2.7、实现clear(),实现清空列表元素

    function clear() {
        delete this.dataStore
        this.dataStore.length = 0
        this.listSize = 0
        this.pos = 0
    }

2.8、实现contains(),判断给定值是否包含于列表中

  function contains(element) {
        for (var i = 0; i < this.dataStore.length; i++) {
            return true
        }
        return false
    }

2.9、实现遍历列表的各个方法

   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对象,往列表添加元素


开始测试:


3、使用迭代器访问列表

(1)从前到后遍历列表

扫描二维码关注公众号,回复: 121260 查看本文章
    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数据结构与算法——列表详解(上)完结

有错误欢迎指出,谢谢。下篇将分析一下列表适合解决的实际问题。

晚安~~

猜你喜欢

转载自blog.csdn.net/fabulous1111/article/details/79796280