模拟单向链表

93 阅读1分钟
function createNode(_current,_next){
    let current =_current || null //指向当前节点的本体
    let next =_next || null
    let headNode = null
    class Node{
        getCurrent(){
            return current
        }
        getNext(){
            return next
        }
        setNext(newnext){
            next = newnext
        }
    }
    return new Node()
}
//模拟单向链表
function createSingleList(dataSource = []){
    // let headNode = _headNode || null  //头节点
    let headNode = null
    class SingleList{
        constructor (){
            //默认添加元素
            dataSource.forEach(item=>{
                this.insert(item)
            })
        }
        //根据索引获取节点
        find(index){
            if(index < 0){
                return null
            }
            let i=0; //表示查找的次数
            let findNode = headNode
            while(i < index && findNode){
                findNode=findNode.getNext()
                i+=1
            }
            return findNode
        }
        insert(current,index){ //添加/插入
            index=index || this.len()
            if(!headNode){  //如果头节点不存在,
                headNode =createNode(current,null)
                return true
            }
            if(index===0){ //添加头节点
                headNode=createNode(current,headNode)
                return true
            }
            let prevIndex = index-1
            let nextIndex=index
            //创建一个新节点,并让新节点的next指向nextIndex对应的节点
            let newNode = createNode(current,this.find(nextIndex))
            //让prevIndex所对应的节点的next指向新节点
            let prevNode= this.find(prevIndex)
            if(prevNode){
                prevNode.setNext(newNode)
                return true
            }else {
                return false
            }
        } 
        remove(index){ //删除
            if(index < 0 || index>=this.len() || !headNode){
                return false
            }
            if(index === 0){
                headNode = headNode.getNext()
                return true
            }
            let findNode = this.find(index)
            let parentNode = this.find(index-1)
            let sonNode = this.find(index+1)
            parentNode.setNext(sonNode)
            return true
        }
        toString(){  //查看
            if(!headNode){
                return []
            }
            let findNode = headNode
            let arr=[{current:findNode.getCurrent(),next:findNode.getNext()}]
            while(findNode){
                findNode =findNode.getNext()
                if(findNode){
                    arr.push({current:findNode.getCurrent(), next:findNode.getNext()})
                }
            }
            return arr
        }
        len(){  //长度
            return this.toString().length
        }
    }
    return new SingleList()
}