js数据结构-链表,集合

94 阅读1分钟

线性结构和链表的区别

数组

  • 需要连续的空间,不满足的时候需要扩容,消耗内存和性能
  • 插入的成本比较高
  • 访问的成本低

链表

  • 不需要连续的空间
  • 插入和删除的时候,时间复杂度为O(1)
  • 访问的时间复杂度为O(n)
  • 每个节点有一个数据和下一个节点的指针

链表的封装

初始化

            //链表的初始化操作
            this.head=null;
            this.length=0;
            function Node(data){
                this.data=data;
                this.next=null;

链表添加元素

            //链表的添加操作
            Linkedlist.prototype.append=function(data){
                var newNode=new Node(data)
                if(this.head==null){
                    this.head=newNode;
                }else{
                    var current=this.head;
                    while(current.next){
                        current=current.next;
                    }
                    current.next=newNode;
                }
                this.length+=1;
            }

双向链表

  • 相比于单向链表,内存更大,每个节点保存数据,前面指针和后面的指针
  • 有利于双向遍历,相比单向链表只能指向下一个比较好

集合

特点

  • 集合比较常见的实现是哈希表
  • 集合通常是一组无序的,不能重复的元素构成

知识储备

        var obj={'zxx':'xx','zz':'44','ddd':111}
        console.log(Object.keys(obj));
        //['zxx','zz','ddd']
        //获取到所有key的属性,以属性形式返回
this.items.hasOwnProperty(value)
//检查对象是否有属性值

如果return 为false那么后面的this.items也不会执行了

            Set.prototype.add=function(value){
                if(this.items.hasOwnProperty(value)){
                    return false
                }
                this.items[value]=value
                return true
            }

封装

        function Set(){
            //用对象,可以实现不重复的性质
            this.items={}
            //方法
            Set.prototype.add=function(value){
                if(this.items.hasOwnProperty(value)){
                    return false
                }
                this.items[value]=value
                return true
            }
            Set.prototype.has=function(value){
                return this.items.hasOwnProperty(value)
            }
            Set.prototype.remove=function(value){
                if(!this.items.hasOwnProperty(value)){
                    return false
                }
                //删除是这样的
                delete this.items[value]
            }
            Set.prototype.clear=function(){
                this.items={}
            }
            Set.prototype.size=function(){
                return Object.keys(this.items).length
            }
            Set.prototype.values=function(){
                return Object.keys(this.items)
            }
        }

字典

特点

  • 和集合很像
  • key是不可以重复,value可以重复,key是无序的
  • 字典的key可以是对象