读【数据结构与算法】之列表

列表就是一组有序的数据。每一个列表项称为元素,这个元素可以是任意数据类型。列表没有对保存元素个数做限制,也就是说会受限于内存。

书中有关于列表的抽象数据类型的定义,大概如下:

  • listSize:属性,列表中元素个数

  • pos:属性,列表当前位置

  • length:方法(书中是属性,有错),返回列表中元素个数

  • clear:方法,清空列表中所有元素

  • toString:方法,返回列表的字符串形式

  • getElement:方法,返回当前位置元素

  • find:方法,查找元素在列表中位置

  • contains:方法,判断元素是否在列表中

  • insert:方法,在现有元素后插入新元素

  • append:方法,在列表末尾添加新元素

  • remove:方法,在列表中删除元素

  • front:方法,将列表的当前位置移动到第一个位置

  • end:方法,将列表的当前位置移动到最后一个位置

  • prev:方法,将当前位置前移一位

  • next:方法,将当前位置后移一位

  • currPos:方法,返回列表当前位置

  • moveTo:方法,将当前位置移动到指定位置

既然是一种类型,需要创建“类”,可以在需要的时候直接创建new就好。

基本实现:

/**
 * Class List
 * 列表类List
 */

function List() {
	this.listSize = 0;
	this.pos = 0;
	this._list = []; // 用于存储数据的数组
}

List.prototype = {

	constructor: List,

	/**
	 * 列表长度
	 * @return {Number} 长度值
	 */
	length: function length() {
		return this.listSize;
	},

	/**
	 * 清空列表
	 * @return {Undefined} undefined
	 */
	clear: function clear() {
		this.listSize = 0;
		this.pos = 0;
		this._list = [];
	},

	/**
	 * 列表字符串结果
	 * @return {String} 字符串结果
	 */
	toString: function toString() {
		return this._list.toString();
	},

	/**
	 * 得到当前位置元素
	 * @return {Any} 当前元素
	 */
	getElement: function getElement() {
		return this._list[this.pos];
	},

	/**
	 * 查找元素在列表中位置
	 * @param  {Any} element 要查找的元素
	 * @return {Number}      位置
	 */
	find: function find(element) {
		for (var i = 0, len = this._list.length; i < len; i++) {
			if (this._list[i] === element) {
				return i;
			}
		}
		return -1;
	},

	/**
	 * 判断元素是否在列表中
	 * @param  {Any} element 要判断的元素
	 * @return {Boolean}     是否在列表中
	 */
	contains: function contains(element) {
		return this.find(element) !== -1;
	},

	/**
	 * 向列表中插入一个元素
	 * @param  {Any} element 插入的元素
	 * @param  {Any} after   列表中某元素
	 * @return {Boolean}     是否插入成功
	 */
	insert: function insert(element, after) {
		var i = this.find(after);
		if (i === -1) return false;
		this._list.splice(i + 1, 0, element);
		this.listSize++;
		return true;
	},

	/**
	 * 列表末尾添加新元素
	 * @param  {Any} element 新元素
	 * @return {Undefined}   undefined
	 */
	append: function append(element) {
		this._list.push(element);
		this.listSize++;
	},

	/**
	 * 在列表中移除元素
	 * @param  {Any} element 移除元素
	 * @return {Boolean}     是否删除成功
	 */
	remove: function remove(element) {
		var i = this.find(element);
		if (i === -1) return false;
		this._list.splice(i, 1);
		this.listSize--;
		return true;
	},

	/**
	 * 将列表的当前位置移动到第一个位置
	 * @return {Undefined} undefined
	 */
	front: function front() {
		this.pos = 0;
	},

	/**
	 * 将列表的当前位置移动到最后一个位置
	 * @return {Undefined} undefined
	 */
	end: function end() {
		this.pos = this.listSize - 1;
	},

	/**
	 * 将当前位置前移一位
	 * @return {Undefined} undefined
	 */
	prev: function prev() {
		this.pos > 0 && --this.pos;
	},

	/**
	 * 将当前位置后移一位
	 * @return {Undefined} undefined
	 */
	next: function next() {
		this.pos < this.listSize - 1 && ++this.pos;
	},

	/**
	 * 返回列表当前位置
	 * @return {Number} 当前位置
	 */
	currPos: function currPos() {
		return this.pos;
	},

	/**
	 * 将当前位置移动到指定位置
	 * @param  {Number} pos 指定位置
	 * @return {Undefined}  undefined
	 */
	moveTo: function moveTo(pos) {
		this.pos = pos;
	}

};

具体运行例子请看demojs实现列表List

发布于: 2014年 09月 05日