马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 鱼币)
如果有收获,别忘了评分 :
这位鱼油,如果喜欢本系列学习笔记,请订阅 专辑☞( 传送门)( 不喜欢更要订阅 )
|