|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2018-4-10 17:16 编辑
上一讲和上上讲把链表最难理解的两个自定义方法介绍完了。
这次,直接把剩余的toString、remove、indexOf、isEmpty、size方法搞定。
toString方法
toSting()方法会把链表中的结果转换成字符串。
首先我们要从head开始遍历整个链表,把current当成索引,控制访问链表项。
还需要初始化用于拼接元素值的变量。
代码:
- 重写继承JS对象toString方法,使其只输出元素
- this.toString = function () {
-
- // 从head开始,遍历链表
- let current = this.getHead(),
- // 用于拼接元素
- string = '';
- };
复制代码
现在进入循环访问链表,用current来检查元素是否存在。
如果链表为空或者遍历到链表的最后一项之后的null,就跳出while循环。
然后将结果拼接到字符串,最后,继续迭代下一个元素,直到返回所有链表内的元素。
在toString方法中,添加代码:
- // 循环遍历链表
- while (current) {
- // 链表为空或或者最后一项后面的null
- string += current.element + (current.next ? ', ' : '');
- current = current.next;
- }
- return string;
复制代码
indexOf方法
indexOf方法接收一个元素,如果存在于链表中,会返回它的位置值,否则返回-1。
一如既往,我们需要一个变量来帮助我们循环访问链表,没错,还是current,初始值是head。
还需要一个index变量来计算位置数,默认是0。
代码:
- // 返回元素在链表中的索引,没有返回-1
- this.indexOf = function (element) {
- // current协助访问链表,index记录位置值
- let current = this.getHead(),
- index = 0;
- };
复制代码
循环开始遍历链表,检查当前元素是否是我们要找的,如果是,返回其位置,反正,略过,继续往下遍历。
继续在indexOf中添加代码:
- // 遍历链表
- while (current) {
- // 如果是,返回当前位置
- if (element === current.element) {
- return index;
- }
- // 反之继续遍历
- index++;
- current = current.next;
- }
复制代码
如果链表为空,或是到达链表的尾部(current = current.next为null),循环就不会执行。
如果最终没有找到任何值,就返回-1。
继续在indexOf中添加代码:
remove方法
remove和indexOf很像,只不过找到指定位置,然后从链表中移除,调用之前的removeAt就可以:
- // 从链表中移除一项
- this.remove = function (element) {
- let index = this.indexOf(element);
- return this.removeAt(index);
- };
复制代码
上面就是重用代码的好处,不再需要同时维护链表中的两种删除方式。
如果有变更,只需要修改其中一个即可。
isEmpty方法
如果链表中没有元素,imEmpty()就返回true,否则返回false。
代码:
- // 检查是否链表是否为空
- this.isEmpty = function () {
- return length === 0;
- };
复制代码
size方法
size方法返回链表的length(长度),链表的length是内部控制的,因为linkList从head构建的。
代码:
- // 返回链表包含的元素个数,即链表长度
- this.size = function () {
- return length;
- };
复制代码
print方法
最终打印链表:
- // 打印链表
- this.print = function () {
- console.log(this.toString());
- };
复制代码
无注解源码:
linkList.zip
(700 Bytes, 下载次数: 3, 售价: 6 鱼币)
如果有收获,别忘了评分 :
这位鱼油,如果喜欢本系列学习笔记,请订阅 专辑☞( 传送门)( 不喜欢更要订阅 )
|
|