美文网首页
双向链表

双向链表

作者: 安石0 | 来源:发表于2018-06-19 22:55 被阅读0次

    双向链表和普通链表的区别在于,双向链表链接是双向的,一个链向上一个元素,一个链向下一个元素。
    所以一个元素应该是:

    node = function(element){
        this.element = element
        this.prev = null// 指向上一个
        this.next = null// 指向下一个
    }
    

    同时不仅包括head,还应该有tail,记录最后一个元素,

    let head = null
    let tail = null
    let length = 0
    

    2 方法实现

    2.1在任意位置插入新元素和移除新元素

    function DoublyLinkedList(){
      let Node = function(element){
        this.element = element
        this.prev = null
        this.next = null
      }
      let head = null
      let tail = null
      let length = 0
      this.insert = function (position,element){
        if(position>=0&&position<=length){// 考虑临界情况
          let node = new Node(element),
          current = head,
          prev,
          index = 0    
          if(position==0){
            if(!head){
              head = node
              tail = node
            }else{
              node.next = current //  node变成了head
              current.prev = node //  之前的head变成了node的下项 
              head = node // 赋值
            }
          }else if(position==length){
            current = tail //保存tail的值
            current.next = node //tail的next指向node
            node.prev = current //node的prev指向之前的tail
            tail = node  //将最后一个值保存为tail
          }else{
            while(index<position){
              prev = current //保存现任值
              current = current.next// 现任变前任,后任继位
              index++ //索引值增加
            }
            prev.next = node
            node.prev = prev
            node.next = current
            current.prev = node
            
          }
            length++
            return node
        }else{
          return null
        }
      }
    //在任意位置移除元素
      this.remove = function(position){
          if(position>=0&&position<=length-1){
            let current = head,index =0,prev
            if(position==0){
            current = current.next
            head = current
            // 还需要改变prev 和 tail
              if(length ===1){
                tail = null
              }else{
                head.prev = null
              }
            }else if(position ==length-1){
            current = tail
            tail = current.prev
            tail.next =null
            }else{
              while(index<position){
                prev = current
                current = current.next
                index++
              }
              prev.next = current.next
              current.next.prev =prev
              
              
            }
            length --
              return current
          }else{
            return null
          }
    }
    //打印head
      this.print = function(){
        console.log(head)
      }
    }
    

    相关文章

      网友评论

          本文标题:双向链表

          本文链接:https://www.haomeiwen.com/subject/wbmzeftx.html