前言:

最近在学习数据结构及算法,数据结构:列表,栈,队列,链表,字典,散列,集合,二叉树算法:图和图算法排序算法:冒泡、选择、插入、希尔、归并、快速检索算法:顺序查找,二分查找;还有高级一点的动态规划贪心算法,这些都会用js一一实现,算是记录下来,给自己以后复习用吧。

先上代码:列表

概念及定义:

列表是一组有序的数据,每个列表中数据被称为元素,元素的数量受内存控制。

不包括任何元素的列表称为空列表。

应用:

不需要很长序列查找元素或排序,元素不是很多。

js实现:

/**
 * 一个简单的列表
 * @constructor
 */
function List() {
  this.dataSource = [];//初始化一个空数组来保存列表元素
  this.listSize = 0;  // 列表长度
  this.pos = 0;  // 当前位置
  this.append = append; // 在列表的末尾添加元素
  this.find = find; // 是否包含元素
  this.getLength = getLength; // 获取列表的长度
  this.remove = remove; // 从列表中删除当前元素
  this.toString = toString; // 返回列表的字符串形式
  this.insert = insert; //在当前位置元素的后面插入元素
  this.clear = clear; // 清空列表
  this.front = front; // 将列表的当前位置移动到第一个元素位置
  this.end = end; // 将列表的当前位置移动到最后一个元素位置
  this.getElement = getElement; // 返回当前位置的元素
  this.prev = prev; // 将列表的当前位置向前移动一位
  this.next = next; // 将列表的当前位置向后移动一位
  this.currentPos = currentPos; // 返回列表的当前位置
  this.moveTo = moveTo; // 将当前位置移动到指定位置
  this.contains = contains; //是否包含该元素
  this.loop = loop; // 列表的遍历器
}
/**
 * 给列表最后添加元素的时候,列表元素个数+1
 * @param element
 */
function append(element) {
  this.listSize++;
  this.dataSource.push(element);
}

/**
 * @param element 如果传入的是对象,需要判断是否是对象以及两个对象是否相等
 * @returns {number} 如果找到,返回位置,否则-1
 */
function find(element) {
  for (var i = 0; i < this.dataSource.length; i++) {
    if (this.dataSource[i] === element) {
      return i;
    }
  }
  return -1;
}

/**
 * 返回列表元素的个数
 * @returns {number}
 */
function getLength() {
  return this.listSize;
}

/**
 * 删除元素成功,元素个数-1
 * @param element
 * @returns {boolean}
 */
function remove(element) {
  var removeIndex = this.find(element);
  if (removeIndex !== -1) {
    this.dataSource.splice(removeIndex, 1);
    this.listSize--;
    return true;
  }
  return false;
}

/**
 * 返回要展示的列表
 * @returns {string}
 */
function toString() {
  return this.dataSource.toString();
}

/**
 * 插入某个元素
 * @param element 要插入的元素
 * @param afterElement 列表中的元素之后
 * @returns {boolean}
 */
function insert(element, afterElement) {
  var insertIndex = this.find(afterElement);
  if (insertIndex !== -1) {
    this.dataSource.splice(insertIndex + 1, 0, element);
    this.listSize++;
    return true;
  }
  return false;
}

/**
 * 清空列表中的所有元素
 */
function clear() {
  delete this.dataSource;
  this.dataSource = [];
  this.listSize = this.pos = 0;
}

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

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

/**
 * 返回当前位置的元素
 * @returns {*}
 */
function getElement() {
  return this.dataSource[this.pos];
}

/**
 * 将当前位置向前移动一位
 */
function prev() {
  --this.pos;
}

/**
 * 将当前位置向后移动一位
 */
function next() {
  ++this.pos;
}


/**
 * 返回列表的当前位置
 * @returns {number|*}
 */
function currentPos() {
  return this.pos;
}

/**
 * 移动到指定位置
 * @param position
 */
function moveTo(position) {
  this.pos = position;
}
/**
 * 是否包含某个元素
 * @param element
 * @returns {boolean}
 */
function contains(element) {
  if(!this.listSize) return false
  var index = this.dataSource.indexOf(element)
  return index
}
/**
 * 迭代器:遍历出所有的元素及其位置
 * @param function(index, data)
 */
function loop (cb) {
  for(this.front();this.currentPos()<this.getLength();this.next()){
    var loopItem = this.getElement();
    var index = this.currentPos();
    (function(index, loopItem){
      cb(index, loopItem);
    })(index, loopItem)
  }
}

var name = new List()
// console.log(name);
name.append('小黑')
name.append('小白')
name.append('小红')
name.append('小紫')
console.log(name.getElement())
name.next()
console.log(name.getElement())
name.loop(function (index, looItem) {
  console.log(index,looItem)
})
console.log(name.contains('小lan'))
复制代码