鱼C论坛

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

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

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

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

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

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中添加代码:
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());
        };




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




如果有收获,别忘了评分


                               
登录/注册后可看大图


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



                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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