链表的实现javascript版

 链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

 

//链表:火车
//每一列不仅携带自己的乘客(item) 还要与下一节火车相连(next)
var LinkedList =function(){
    //链表头
    var head =null //null :object类型只不过是空的
    //链表长度
    var length=0 //初始长度

    //辅助类:节点
    var Node =function(element){
        this.element=element
        this.next=null
    }

    //链表尾添加元素
    this.append=function(element){
        var node =new Node(element)
        //node ={
        //     element:element,
        //     next:null
        // }
        
        if(head ==null){
            head =node
        }else{
            var current=head
            while(current.next){
                current=current.next
            }
            //while循环结束之后 current已经到了链表最后一项
            current.next =node
        }
        length++
    }
    //指定位置添加元素
    this.insert =function(position,element){
        //越界
        if(position>-1&&position<length){
            var node =new Node(element)
            if(position ==0){
                var current =head
                head =node 
                head.next=current
            }else{
                var index=0
                var current =head
                var previous=null
                while(index<position){
                    previous =current
                    current=current.next
                    index++
                }

                previous.next =node
                node.next=current
            }
            length++
        }else{
            return false
        }
    }

    //移除数组
    this.removeAt =function(position){
        if(position>-1&&position<length){
            var index=0
            var current=head
            if(position==0){
                head =current.next                
            }else{
                while(index<position){
                    previous =current
                    current =current.next
                    index++
                }
                previous.next=current.next

            }
            length--
            return current
        }
        return null
    }

    //获取某个元素的位置
    this.indexOf =function(element){
        var current =head
        var index=0
        while(current){
            if(element==current.element){
                return index
            }
            current =current.next
            index++
        }
        return -1
    }

    //移除某个元素
    this.remove =function(element){
        var index =this.indexOf(element)
        return this.removeAt(index)
    }

    //检查是否为空
    this.isEmpty =function(){
        return length==0
    }

    //长度
    this.size =function(){
        return length
    }

    //获得链表头
    this.getHead =function(){
        return head
    }    
}
var l =new LinkedList()
console.log(l.getHead())
l.append(1)
l.append(2)
l.append(3)
l.append(4)
// l.remove(0)
// console.log(l.removeAt(1))
// console.log(l.indexOf(8))
console.log(l.remove(3))
console.log(l.getHead())
console.log(l.isEmpty())
console.log(l.size())

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值