JS中的算法与数据结构之列表(List)实例详解(2)

//该方法需要传入两个参数,第一个参数表示待插入的元素,第二个参数表示待插入元素的前一个元素,用于确定插入元素的位置,并调用 splice 方法更改列表数组,插入成功后更新 listSize 并返回 true , 否则返回 false; function insert( element , after ){ var insertPos = this.find( after ); if( insertPos > -1 ){ this.dataStore.splice( insertPos + 1 , 0 , element ); this.listSize ++; return true; } return false; }

现在,我们把 Grape 放到原来的位置上去;

fruits.insert( 'Grape' , 'Apple' ); console.log( fruits.toString() ) // ["Apple", "Grape", "Banana"]

ok,现在已经能够把 Grape 插入到原来的位置了。

如果我吃完了所有水果,我现在想要清空列表,我们就需要一个 clear 方法;

clear:清空列表

//该方法使用 delete 操作符删除 dataStore 数组 , 接着创建新的数组,并将其 listSize 和 pos 初始化设为 1 。 function clear(){ delete this.dataStore; this.dataStore = []; this.listSize = this.pos = 0; }

我们不妨试一试。

fruits.clear(); console.log( fruits.toString() ); // []

成功了!

上面我们看到了列表中有个 pos 属性,表示当前列表所在的位置,我们接下来就围绕它做点事情,让用户可以自由操作列表

front:将列表的位置移到第一个位置上

//该方法只要将 pos 置为 0 即可 function front(){ this.pos = 0 ; }

end:将列表的位置移到最后一个位置上

//同上,该方法只要将 pos 置为列表长度减 1 即可,因为数组下标从 0 开始嘛 function end(){ this.pos = this.listSize - 1; }

prev:将当前位置前移一位

//只要将 pos 的位置减 1 即可,但要主要不能越界 function prev(){ if( this.pos > 0 ){ this.pos --; }else{ console.log('您当前已在首位'); } }

next:将当前位置后移一位

//同理,只要将 pos 的位置加 1 即可,但要主要不能越界 function next(){ if( this.pos < this.listSize - 1 ){ ++this.pos; }else{ console.log('您当前已在末尾'); } }

moveTo:将当前位置移动到指定位置

//直接改变 pos 的值即可,注意输入的合法性 function moveTo( position ){ if( position < 0 || position > (this.listSize - 1) ){ console.log('请输入正确的位置'); }else{ this.pos = position; } }

我既然可以随意改变我的列表位置,那我总得知道我当前位置在哪里啊,因此我们需要 currPos 和 getElement 两个方法分别返回当前的位置和元素;

currPos:返回列表的当前位置

//只需将 pos 直接返回即可 function currPos(){ return this.pos; }

getElement:返回当前位置的元素

//直接取对应的元素就好 function getElement(){ return this.dataStore[this.pos]; }

接着,我们测试一下,首先将列表恢复到清空前的样子,然后我们在多添加几个元素进去。

//再添加几个 fruits.append('Pear'); fruits.append('Orange'); fruits.append('Strawberry'); console.log( fruits.toString() ); // ["Apple", "Grape", "Banana", "Pear", "Orange", "Strawberry"] //我们先看当前的位置和元素 console.log( fruits.currPos() ); // 0 console.log( fruits.getElement() ); // Apple //我们尝试改变一下 fruits.moveTo( 2 ); fruits.next(); console.log( fruits.currPos() ); // 3 console.log( fruits.getElement() ); // Pear fruits.end(); fruits.prev(); console.log( fruits.currPos() ); // 4 console.log( fruits.getElement() ); // Orange

至此,我们已经基本完成了列表的所有功能,还差最后一个,判断给定元素是否在列表内,我们这里采用 contains 方法

contains:判断给定值是否在列表中

//我们直接利用利用 indexOf() 或者采用跟为高级的 ES6 中的 includes 方法来判断 //ES5 function contains( element ){ if( this.dataStore.indexOf( element ) > -1 ) return true; else return false; } //ES6 function contains( element ){ return this.dataStore.includes( element ); }

( ps:对 ES6 不太熟悉的同学,也可以参考本站https://www.jb51.net/article/138409.htm )

写完测试一下,

console.log(fruits.contains('Banana')); // true console.log(fruits.contains('Watermelon')); // false

大功告成!我们自己用 javascript 实现了一个列表,至于后面如何拓展,自己可以发散思维,多动手实践实践,一起加油!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b3f467375f965dab82aa91c3598e4f54.html