不二如是 发表于 2018-4-10 17:16:51

0012 ¥ 自建链表方法之#小综合

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

http://xxx.fishc.com/forum/201803/20/101934b3igkgm9hgbgz0ck.gif



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

这次,直接把剩余的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中添加代码:
return -1;



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());
      };



无注解源码:



如果有收获,别忘了评分{:10_281:} :

http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif

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

http://xxx.fishc.com/forum/201803/21/151715umqz1qoywp11wjbq.gif
页: [1]
查看完整版本: 0012 ¥ 自建链表方法之#小综合