数据结构与算法JavaScript描述(1) —— 列表(List )

一组有序的数据集合,集合中的每个数据项叫做元素,可对这些数据项进行增删改查操作。

应用:存储数据,进行数据的简单查找和排序

实现:

class List {

    constructor() {
        this.elements = []
        this.pos = 0            // 列表的当前位置
    }

    // 返回列表中元素的个数
    get length() {
        return this.elements.length
    }

    // 清空列表中的所有元素
    clear() {
        this.elements = []
    }

    // 在列表中查找某一元素
    find(ele) {
        return this.elements.indexOf(ele)
    }

    // 返回列表的字符串形式
    toString() {
        return this.elements.toString()
    }

    // 在现有元素后插入新元素
    insert(after, ele) {
        if (this.find(after) > -1) {
            const index = this.find(after) + 1
            this.elements.splice(index, 0, ele)
            return true
        }
        return false
    }

    // 给列表添加元素
    append(ele) {
        this.elements.push(ele)
    }

    // 从列表中删除元素
    remove(ele) {
        if (this.find(ele) > -1) {
            this.elements.splice(this.find(ele), 1)
            return true
        }
        return false
    }

    // 返回列表的当前位置
    currPos() {
        return this.pos
    }

    // 返回当前位置的元素
    getElement() {
        return this.elements[this.pos]
    }

    // 将列表的当前位置设移动到第一个元素
    front() {
        this.pos = 0
    }

    // 将列表的当前位置移动到最后一个元素
    end() {
        this.pos = this.length - 1
    }

    // 将当前位置前移一位
    prev() {
        if (this.pos > 0) {
            this.pos--
            return this.getElement()
        }
    }

    // 将当前位置后移一位
    next() {
        if (this.pos < this.length - 1) {
            this.pos++
            return this.getElement()
        }
    }

    // 将当前位置移动到指定位置
    moveTo(pos) {
        if (pos >= 0 && pos < this.length) {
            this.pos = pos
            return this.getElement()
        }
    }

    // 实现一个迭代器(Iterator),可以使用for...of...循环
    /**
     * next(): 返回 { value: all_type, done: Boolean }
     * value: 列表中的某个值
     * done: 标明迭代是否结束
     */
    [Symbol.iterator]() {
        this.pos = 0
        return {
            next: () => {
                this.pos++
                if (this.pos > this.length) {
                    return {
                        value: null,
                        done: true
                    }
                } else {
                    return {
                        value: this.elements[this.pos - 1],
                        done: false
                    }
                }
            }
        }
    }

}

示例:

// test 
var names = new List()
names.append('Clayton')
names.append('Raymond')
names.append('Cynthia')
names.append('Jennifer')
names.append('Bryan')
names.append('Danny')
names.insert('Cynthia', 'Hysunny')
console.log(names.toString())           // Clayton,Raymond,Cynthia,Hysunny,Jennifer,Bryan,Danny

console.log(names.currPos())            // 0
names.front()
console.log(names.getElement())     // Clayton
names.next()
console.log(names.getElement())     // Raymond
names.moveTo(4)                                     
console.log(names.getElement())     // Bryan

names.remove('Bryan')
console.log(names.toString())           // Clayton,Raymond,Cynthia,Hysunny,Jennifer,Danny

// 使用迭代器
for (var name of names) {
    console.log(name)
}
// Clayton,Raymond,Cynthia,Hysunny,Jennifer,Danny


names.clear()
console.log(names.length)                   // 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,890评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,886评论 18 399
  • “我听说,依靠激情维持的关系不可能长久” 突然想起《生死时速》结尾部分“陷入爱河”的安妮对杰克的那句经...
    基德徐元杰阅读 442评论 3 5
  • 我要学编程python 我要继续保持看书运动 82.5 weist 增加写字的习惯
    米粒粒1阅读 145评论 0 0