JavaScript双向链表的封装

 class DoubleLinkedList {
        constructor(data) {
          this.header = null;
          this.data = data;
          this.next = null;
          this.prev=null;
          this.tail=null
          this.length = 0;
        }
        // 尾部插入
        append(element) {
          let newNode = new DoubleLinkedList(element);
          if (this.length == 0) {
            this.header = newNode;
            this.tail=newNode
          } else {
            let current = this.header;
            while (current.next) {
              current = current.next;
            }
            current.next = newNode;
            newNode.prev=current
            this.tail=newNode
          }
          this.length = this.length + 1;
        }
        toString() {
          let current = this.header;
          let str = "";
          while (current) {
            str += current.data + " ";
            current = current.next;
          }
          return str;
        }
        // 插入
        insert(position, element) {
          if (position < 0 || position >= this.length) {
            return false;
          }
          let newNode = new DoubleLinkedList(element);
          if (position == 0) {
            let oldNode = this.header;
            this.header = newNode;
            newNode.next = oldNode;
          } else {
            let current = this.header;
            for (let i = 0; i < position; i++) {
              current = current.next;
            }
            let prv = this.header;
            for (let i = 0; i < position - 1; i++) {
              prv = prv.next;
            }
            prv.next = newNode;
            newNode.next = current;
          }
          this.length = this.length + 1;
        }
        removeAt(position) {
          if (position < 0 || position >= this.length) {
            return false;
          }
          if (position == 0) {
            this.header = this.header.next;
          }
          if (position > 0 && position <= this.length - 1) {
            let current = this.header;
            for (let i = 0; i < position; i++) {
              current = current.next;
            }
            let prv = this.header;
            for (let i = 0; i < position - 1; i++) {
              prv = prv.next;
            }
            if (current.next) {
              prv.next = current.next;
            } else {
              prv.next = null;
            }
          }
          this.length = this.length - 1;
        }
        remove(element) {
          let res = -1;
          let current = this.header;
          for (let i = 0; i < this.length; i++) {
            if (current.data === element) {
              res = i;
            }
            current = current.next;
          }
          if (res != -1) {
            this.removeAt(res);
          }
        }
        upDate(position, element) {
          if (position < 0 || position >= this.length) {
            return null;
          }
          let current = this.header;
          for (let i = 0; i < position; i++) {
            current = current.next;
          }
          current.data = element;
        }
        get(position) {
          if (position < 0 || position >= this.length) {
            return null;
          }
          let current = this.header;
          for (let i = 0; i < position; i++) {
            current = current.next;
          }
          return current.data;
        }
        indexOf(element) {
          let current = this.header;
          let res = -1;
          for (let i = 0; i < this.length; i++) {
            if (current.data === element) {
              res = i;
              break;
            }
            current = current.next;
          }
          return res;
        }
        forward(){
            if(!this.tail){
                return false
            }
            let startNode=this.header
            let arr=[]
            while(startNode.next){
                arr.push(startNode.data)
                startNode=startNode.next
            }
            arr.push(startNode.data)
            return arr
        }
        backword(){ 
            if(!this.tail){
                return false
            }
            let endNode=this.tail
            let arr=[]
            while(endNode.prev){
                arr.push(endNode.data)
                endNode=endNode.prev
            }
            arr.push(endNode.data)
            return arr
        }
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值