鱼C论坛

 找回密码
 立即注册
查看: 1347|回复: 0

[庖丁解牛] 0012 ¥ 自建链表方法之#小综合

[复制链接]
发表于 2018-4-10 17:16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2018-4-10 17:16 编辑


                               
登录/注册后可看大图





上一讲上上讲把链表最难理解的两个自定义方法介绍完了。

这次,直接把剩余的toString、remove、indexOf、isEmpty、size方法搞定。




toString方法

toSting()方法会把链表中的结果转换成字符串。

首先我们要从head开始遍历整个链表,把current当成索引,控制访问链表项。

还需要初始化用于拼接元素值的变量。

代码:
  1. 重写继承JS对象toString方法,使其只输出元素
  2.         this.toString = function () {
  3.             
  4. //            从head开始,遍历链表
  5.             let current = this.getHead(),
  6. //                用于拼接元素
  7.                 string = '';
  8.         };
复制代码


现在进入循环访问链表,用current来检查元素是否存在。

如果链表为空或者遍历到链表的最后一项之后的null,就跳出while循环。

然后将结果拼接到字符串,最后,继续迭代下一个元素,直到返回所有链表内的元素。

在toString方法中,添加代码:
  1. //            循环遍历链表
  2.             while (current) {
  3. //                链表为空或或者最后一项后面的null
  4.                 string += current.element + (current.next ? ', ' : '');
  5.                 current = current.next;
  6.             }
  7.             return string;
复制代码





indexOf方法

indexOf方法接收一个元素,如果存在于链表中,会返回它的位置值,否则返回-1。

一如既往,我们需要一个变量来帮助我们循环访问链表,没错,还是current,初始值是head。

还需要一个index变量来计算位置数,默认是0。

代码:
  1. //        返回元素在链表中的索引,没有返回-1
  2.         this.indexOf = function (element) {
  3. //            current协助访问链表,index记录位置值
  4.             let current = this.getHead(),
  5.                 index = 0;
  6.         };
复制代码


循环开始遍历链表,检查当前元素是否是我们要找的,如果是,返回其位置,反正,略过,继续往下遍历。

继续在indexOf中添加代码:
  1. //            遍历链表
  2.             while (current) {
  3. //                如果是,返回当前位置
  4.                 if (element === current.element) {
  5.                     return index;
  6.                 }
  7. //                反之继续遍历
  8.                 index++;
  9.                 current = current.next;
  10.             }
复制代码


如果链表为空,或是到达链表的尾部(current = current.next为null),循环就不会执行。

如果最终没有找到任何值,就返回-1。

继续在indexOf中添加代码:
  1. return -1;
复制代码





remove方法

remove和indexOf很像,只不过找到指定位置,然后从链表中移除,调用之前的removeAt就可以:
  1. //        从链表中移除一项
  2.         this.remove = function (element) {
  3.             let index = this.indexOf(element);
  4.             return this.removeAt(index);
  5.         };
复制代码


上面就是重用代码的好处,不再需要同时维护链表中的两种删除方式。

如果有变更,只需要修改其中一个即可。




isEmpty方法

如果链表中没有元素,imEmpty()就返回true,否则返回false。

代码:
  1. //        检查是否链表是否为空
  2.         this.isEmpty = function () {
  3.             return length === 0;
  4.         };
复制代码





size方法

size方法返回链表的length(长度),链表的length是内部控制的,因为linkList从head构建的。

代码:
  1. //        返回链表包含的元素个数,即链表长度
  2.         this.size = function () {
  3.             return length;
  4.         };
复制代码





print方法

最终打印链表:
  1. //        打印链表
  2.         this.print = function () {
  3.             console.log(this.toString());
  4.         };
复制代码





无注解源码: linkList.zip (700 Bytes, 下载次数: 3, 售价: 6 鱼币)




如果有收获,别忘了评分


                               
登录/注册后可看大图


这位鱼油,如果喜欢本系列学习笔记,请订阅 专辑☞传送门)(不喜欢更要订阅



                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表