- 《数据结构与算法JavaScript描述》读书笔记之二
- 列表
- 未完
chapter-3 列表
- 列表是一组有序的数据,每个列表中的数据项称为元素。
- 在JavaScript中,列表中元素可以是任意数据类型。个数不限,但是使用中受到内存的限制
适合列表的数据结构
- 数据存储的顺序不重要
- 不必在一个很长的序列中查找元素
- 列表中123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153### 特性- 空列表(不含元素)- 列表的length:包含的元素个数- 列表末尾append一个元素,也可以在给定的元素后或起始位置insert一个元素- remove删除元素- clear清空列表元素- toString显示列表中所有元素- getElement显示当前元素- 描述元素位置的属性:front,end前后- next()从当前元素移动到下一个元素- prev()从当前元素移动到当前元素的前一个元素- moveTo(n)直接移动到指定位置,移动到第N个位置- currPos列表当前位置### 抽象数据类型定义#### 属性- listSize 元素个数- pos 当前位置#### 方法- length 返回元素个数- clear 清空列表中的所有元素- toString 返回列表字符串形式- getElement 返回当前位置元素- insert 在现有元素后插入新元素- append 列表末尾添加新元素- remove 删除某元素- front 当前位置移动到第一个元素- end 移动到最后一个元素- prev 后移一位- next 前移一位- currPos 返回列表当前位置- moveTo 当前位置移动到指定位置### 实现```javascriptfunction List () {this.listSize = 0;this.pos = 0;// 保存列表元素this.dataStore = [];}// 实现一个列表List.prototype = {constructor: List,// 清空clear: function () {delete this.dataStore;//创建空数组, 设置新的空列表this.dataStore.length = 0;this.listSize = this.pos = 0;},// 辅助方法find: function (element) {// 是否可以用indexOf代替??for (var i = 0; i < this.dataStore.length;i++){if (this.dataStore[i] === element) {return i;}}// 错误校验return -1;},// 显示列表元素toString: function () {// 目的是显示当前状态return this.dataStore;},// 插入insert: function (element, after) {var insertPos = this.find(after);if (insertPos > -1) {this.dataStore.splice(insertPos + 1, 0, element);this.listSize++;return true;}return false;},// 给列表添加元素append: function (element) {// 新元素就位后,变量listSize加1this.dataStore[this.listSize++] = element;},// 从列表中删除元素/* 1. 先找到该元素(find)2. 然后删除他,(splice)3. 调整底层数组对象以填补删除该元素的空白*/remove: function (element) {var foundAt = this.find(element);if (foundAt > -1) {this.dataStore.splice(foundAt, 1);this.listSize--;return true;}return false;},// 移动到第一个元素front: function () {this.pos = 0;},// 移动到最后一个元素上end: function () {this.pos = this.listSize - 1;},// 向前一个prev: function () {if (this.pos > 0) {this.pos--;}},// 向后移动一个元素next: function () {if (this.pos < this.listSize - 1) {this.pos ++;}},// 元素个数length: function () {return this.listSize;},// 返回当前指向currPos: function () {return this.pos;},// 移动到某个指向moveTo: function (position) {this.pos = position;},// 返回当前指向的元素getElement: function () {return this.dataStore[this.pos];},// 判断给定值是否在列表中contains: function (element) {// indexOf??for (var i = 0; i < this.dataStore.length;i++) {if (this.dataStore[i] === element) {return true;}return false;}},// this.pos 是否可以再次加1hasNext () {return this.pos < this.listSize - 1;},// this.pos 是否可以再次加1hasPrev () {return this.pos > 0;}};
测试结果:
使用迭代器访问列表
- front,end,prev,next,currPos实现了cList类的一个迭代器
- 和数组索引的优点:
- 访问时不用关心底层数据结构(貌似也是数组??)
- 添加元素时,索引值不对了,只要更新列表,不更新迭代器
- 可以用不同数据类型存储方式实现,访问元素的api是统一的
-( ppppps:实在是不理解)
|
|