JavaScript 链表-阿里云开发者社区

开发者社区> 白穆羽> 正文

JavaScript 链表

简介: 数组的大小是固定的,从数组的起点或者中间插入或移除项,成本很高,因为需要移动元素,Array类方法的背后是同样的问题。 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续的,每个元素由一个存储元素本身的节点,和一个指向下一个元素的引用组成(指针、链接)。
+关注继续查看

数组的大小是固定的,从数组的起点或者中间插入或移除项,成本很高,因为需要移动元素,Array类方法的背后是同样的问题。

链表存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续的,每个元素由一个存储元素本身的节点,和一个指向下一个元素的引用组成(指针、链接)。


ad3e72caf92ac615fab0059cfd68f39e6fa6a29f

声明:

function LinkedList(){
    var Node = function(element){//辅助类
        this.element = element;
        this.next = null;
    }

    var length = 0;
    var head = null;

    //在链表末尾插入
    this.append = function(element){
        var node = new Node(element);
        var current;

        if(head === null){
            head = node;
        }else{
            current = head;

            while(current.next){
                current = current.next;
            }
            current.next = node;
        }
        length++;
    }
    //在任意位置插入一个元素
    this.insert = function(position,element){
        //检查越界值
        if(position>= 0 && position<= length){
            var node = new Node(element);
            var current = head;
            var previous;
            var index = 0;

            //在第一个位置添加
            if(position === 0){
                node.next = current;
                head = node;
            }else{
                while(index++ < position){
                    previous = current;
                    current = current.next;
                }
                node.next = current;
                previous.next = node;
            }
            length++;
            return true;
        }else{
            return false;
        }
    }

    //从链表的特定位置移除一项
    this.removeAt = function(position){
        //检查越界值
        if(position>-1 && position<length){
            var current = head;
            var previous ;
            var index = 0;
            //如果传入的位置为第一项
            if(position === 0){
                head = current.next;//移除第一项
            }else{
                while(index++ < position){
                    previous = current;
                    current = current.next;
                }
                //将previous与current的下一项链接起来:跳过current,从而移除它
                previous.next = current.next;
            }
            length--;
        }else{
            return null;//越界则表示没有该项
        }
    }

    //删除指定元素
    this.remove = function(element){
        var index = this.indexOf(element);
        return this.removeAt(index)
    }

    //找到指定元素,找到则返回位置,没找到返回-1
    this.indexOf = function(element){
        var current = head;
        var index = 0;             //这里的index设置为几,那么获取元素的位置就从几开始,设置为1则第一个元素的位置就返回1
        while(current){
            if(element === current.element){
                return index;
            }
            index++;
            current = current.next;
        }
        return -1;
    }

    //返回链表是否为空  空位true 非空位false
    this.isEmpty = function(){
        return length === 0;
    }

    //返回链表长度
    this.size = function(){
        return length;
    }

    //只输出末尾对象的内容
    this.toString = function(){
        var current = head;
        var string = '';
        while(current){
            string += current.element + ',';
            current = current.next;
        }
        return string;
    }

    this.getHead = function(){
        return head;
    }
}

实例化调用:


var list = new LinkedList();
list.append(5);
console.log('长度:'+list.size())
list.append(10);
console.log('长度:'+list.size())
console.log('内容:'+list.toString())
console.log('头部内容:'+list.getHead().element)
list.append(15);
list.append(20);
list.append(25);
list.append(30);
console.log('长度:'+list.size())
console.log('是否为空:'+list.isEmpty())
console.log('10在哪里:'+list.indexOf(10))
console.log(list.toString())
list.remove(20)
console.log(list.toString())
list.removeAt(2);
console.log('长度:'+list.size())
console.log(list.toString())

打印结果:

24c30780d96e6a686485ee0075c645f6f55be1f8




6efab1869072f77cc579de71871a9af95bee2342

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26789 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2962 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
11818 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4659 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7496 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
22402 0
+关注
白穆羽
梦想与现实都要勇往直前
7
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载