數據結構與算法-列表(List)

百度百科解釋:
以表格爲容器,裝載着文字或圖表的一種形式,叫列表。
<數據結構術語>數據結構中的列表通常指線性列表的簡稱
列表是一種數據項構成的有限序列,即按照必定的線性順序,排列而成的數據項的集合,在這種數據結構上進行的基本操做包括對元素的的查找,插入,和刪除javascript

平常生活中人們使用的列表:行程安排列表、待辦事項列表、榜單列表等。java

javascript中沒有原生定義的列表,但咱們能夠根據列表思想,建立列表類,抽象列表的數據類型,實現列表功能。數組

列表的抽象數據類型定義

定義 說明
listSize(屬性) 列表的元素個數
pos(屬性) 列表的當前位置
dataStore(屬性) 空數組保存列表元素
append(方法) 在列表的末尾添加新元素
find(方法) 在列表中查找某一個元素
remove(方法) 從列表中刪除元素
length(方法) 返回列表中有多少元素
toString(方法) 返回列表中的字符串形式
insert(方法) 在現有元素後插入新元素
clear(方法) 清空列表中的全部元素
contains(方法) 判斷給定值是否在列表中
getElement(方法) 返回當前位置的元素
front(方法) 將列表的當前位置移動到第一個元素
end(方法) 將列表的當前位置移動到最後一個元素
prev(方法) 將當前位置後移一位
next(方法) 將當前位置前移一位
hasNext(方法) 判斷後一位
hasPrev(方法) 判斷前一位
currPos(方法) 返回列表的當前位置
moveTo(方法) 將當前位置移動到指定位置

實現列表類

function List() {
    this.listSize = 0
    this.pos = 0 // 當前位置
    this.dataStore = [] // 初始化一個空數組來保存列表元素
}
List.prototype = {
    constructor: List,
    append: function () {},
    find: function () {},
    remove: function () {},
    length: function () {},
    toString: function () {},
    insert: function () {},
    clear: function () {},
    contains: function () {},
    front: function () {},
    end: function () {},
    prev: function () {},
    next: function () {},
    currPos: function () {},
    moveTo: function () {},
    getElement: function () {},
    hasNext: function () {},
    hasPrev: function () {}
}
複製代碼

具體方法實現

append: function (element) {
    this.dataStore[this.listSize] = element
    this.listSize++
}
// 給列表的下一個位置增長一個新的元素,該位置正好等於listSize的值,添加好元素後,listSize加1
複製代碼
find: function (element) {
    for (var i = 0; i < this.dataStore.length; i++) {
        if (this.dataStore[i] === element) {
            retrun i
        }
    }
    return -1
}
// 在列表中查找某一元素,若是找到返回該位置,不然返回-1
複製代碼
remove: function (element) {
    var foundAt = thsi.find(element)
    if (foundAt > -1) {
        this.dataStore.splice(foundAt, 1)
        this.listSize--
        return true
    }
    return false
}
/* remove()方法是cList類中較難實現的一個方法, 首先,須要在列表中找到該元素, 而後刪除,而且調整底層的數組對象以填補刪除該元素後留下的空白。 可是,在js中可使用splice()方法來簡化這一過程 */
複製代碼
length: function () {
    return this.listSize
}
// 返回列表元素個數
複製代碼
toString: function () {
    return this.dataStore
}
// 返回元素數組
複製代碼
insert: function (element, after) {
    var insertPos = this.find(after)
    if (insertPos > -1) {
        this.dataStore.splice(insertPos + 1, element)
        this.listSize++
        return true
    }
    return false
}
// 找到傳入的after參數在列表中的位置,使用splice()將新元素插入該位置以後,而後長度+1並返回true
複製代碼
clear: function () {
    delete this.dataStore
    this.dataStore.length = 0
    this.listSize = this.pos = 0
}
// 置空
複製代碼
contains: function (element) {
    for (var i = 0; i < this.dataStore.length; i++) {
        if (this.dataStore[i] === element) {
            return true
        }
    }
    return false
}
// 循環判斷給定值是否在列表中
複製代碼
// 使用迭代器訪問列表
front: function () {
    this.pos = 0
}
end: function () {
    this.pos = this.listSize - 1
}
prev: function () {
    this.pos--
}
next: function () {
    if (this.pos < this.listSize) {
        this.pos++
    }
}
currPos: function () {
    return this.pos
}
moveTo: function (positon) {
    this.pos = position
}
getElement: function () {
    return this.dataStore[this.pos]
}
hasNext: function () {
    return this.pos < this.listSize
}
hasPrev: function () {
    return this.pos >= 0
}
// 使用迭代器,能夠沒必要關心數據的內部存儲方式,以實現對列表的遍歷。
// 相似指針,在列表上隨意移動(嚴格意義上不是指針)
複製代碼
// 迭代器遍歷列表的例子
for (names.front(); names.hasNext(); names.next()) {
    console.log(names.getElement())
}
// 在for循環的一開始,將列表的當前位置設置爲第一個元素,只要currPos的值小於列表的長度,就一直循環,每一次循環都調用next()將當前位置移動一位
複製代碼

列表的應用

function List() {
    this.listSize = 0
    this.pos = 0 // 當前位置
    this.dataStore = [] // 初始化一個空數組來保存列表元素
}
List.prototype = {
    constructor: List,
    append: function (element) {
        this.dataStore[this.listSize] = element
        this.listSize++
    },
    find: function (element) {
        for (var i = 0; i < this.dataStore.length; i++) {
            if (this.dataStore[i] === element) {
                return i
            }
        }
        return -1
    },
    remove: function (element) {
        var foundAt = thsi.find(element)
        if (foundAt > -1) {
            this.dataStore.splice(foundAt, 1)
            this.listSize--
            return true
        }
        return false
    },
    length: function () {
        return this.listSize
    },
    toString: function () {
        return this.dataStore
    },
    insert: function (element, after) {
        var insertPos = this.find(after)
        if (insertPos > -1) {
            this.dataStore.splice(insertPos + 1, element)
            this.listSize++
            return true
        }
        return false
    },
    clear: function () {
        delete this.dataStore
        this.dataStore.length = 0
        this.listSize = this.pos = 0
    },
    contains: function (element) {
        for (var i = 0; i < this.dataStore.length; i++) {
            if (this.dataStore[i] === element) {
                return true
            }
        }
        return false
    },
    front: function () {
        this.pos = 0
    },
    end: function () {
        this.pos = this.listSize - 1
    },
    prev: function () {
        this.pos--
    },
    next: function () {
        if (this.pos < this.listSize) {
            this.pos++
        }
    },
    currPos: function () {
        return this.pos
    },
    moveTo: function (positon) {
        this.pos = position
    },
    getElement: function () {
        return this.dataStore[this.pos]
    },
    hasNext: function () {
        return this.pos < this.listSize
    },
    hasPrev: function () {
        return this.pos >= 0
    }
}
var movies = ['電影1', '電影2', '電影3', '電影4', '電影5', '電影6', '電影7', '電影8', '電影9', '電影10']
var movieList = new List() // 根據前面寫的List類new出列表對象
// 列表中添加對應內容
for (var i = 0; i < movies.length; i++) {
    movieList.append(movies[i])
}
// 顯示列表內容
function displayList() {
    for (movieList.front(); movieList.hasNext(); movieList.next()) {
        console.log(movieList.getElement())
    }
}

displayList()

// 更多用法請觸類旁通。
複製代碼

列表類實際上是對數組的封裝,提供一套方法給外面方便使用。相似的咱們也能夠封裝某些功能的類庫,使用時就能方便的new出該類的對象,調用該類的方法。

相關文章
相關標籤/搜索