数据结构与算法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

你可能感兴趣的:(数据结构与算法JavaScript描述(1) —— 列表(List ))