es6 实现双链表

const util = require('util');
/**
 * 链表节点类
 */
class Node {
  constructor (ele) {
    this.ele = ele;
    this.next = null;
    this.prev = null;
  }
}
/**
 * 链表类
 */
class NodeList {
  constructor (ele) {
    this.head = null; // 初始化链表的头节点
    this.length = 0;
  }
  /**
   *  尾部插入数据
   * @param {*} ele
  */
  append (ele) {
    let newNode = new Node(ele);
    let currentNode;
    if (this.head === null) {
      this.head = newNode;
    } else {
      currentNode = this.head;
      while (currentNode.next) {
        currentNode = currentNode.next;
      }
      currentNode.next = newNode;
      newNode.prev = currentNode;
    }
    this.length++;
  }
  /**
   * 项链表某个位置插入元素
   * @param {*} position
   * @param {*} ele
   */
  insert (position, ele) {
    if (position >= 0 && position <= this.length) {
      let newNode = new Node(ele);
      let currentNode = this.head;
      let pre;
      let index = 0;
      if (position === 0) {
        if (currentNode === null) {
          this.head = newNode;
        } else {
          this.head = newNode;
          newNode.next = currentNode;
          currentNode.prev = newNode;
        }
      } else if (position === this.length) {
        this.append(ele);
        return;
      } else {
        while (index < position) {
          pre = currentNode;
          currentNode = currentNode.next;
          index++;
        }
        newNode.next = currentNode;
        currentNode.prev = newNode;
        pre.next = newNode;
        newNode.prev = pre;
      }
      this.length++;
    } else {
      return new Error('位置超出范围');
    }
  }
  removeAt (position) {
    if (position >= 0 && position < this.length) {
      let currentNode = this.head;
      let pre;
      let index = 0;
      if (position === 0) {
        this.head = currentNode.next;
      } else {
        while (index < position) { // 1,2,3
          pre = currentNode;
          currentNode = currentNode.next;
          index++;
        }
        pre.next = currentNode.next;
        if (currentNode && currentNode.next !== null) {
          currentNode.next.prev = pre;
        }
      }
      this.length--;
    } else {
      return new Error('删除位置有误');
    }
  }
  find (ele) {
    let currentNode = this.head;
    let index = 0;
    while (currentNode) {
      if (JSON.stringify(currentNode.ele) === JSON.stringify(ele)) {
        return index;
      } else {
        index++;
        currentNode = currentNode.next;
      }
    }
    return -1;
  }
  // 判断链表是否为空
  isEmpty () {
    return this.length === 0;
  }
  size () {
    return this.length;
  }
  // 返回头
  getHead () {
    return this.head;
  }
  toString () {
    let current = this.head;
    let str = '';
    while (current) {
      str += JSON.stringify(current.ele) + ' => ';
      current = current.next;
    }
    return str;
  }
}
let A = { name: 'A', age: 10 };

let B = { name: 'B', age: 20 };

let C = { name: 'C', age: 30 };

let D = { name: 'D', age: 40 };

let E = { name: 'E', age: 50 };

let G = { name: 'G', age: 50 };

let nList = new NodeList();

nList.append(A);
nList.append(C);
nList.append(B);
nList.append(D);
nList.append(E);
// console.log(JSON.stringify(nList, null, 2));
nList.insert(5, G);
console.log(' origin: ' + nList);
nList.removeAt(5);
console.log('now: ' + nList);
console.log(util.inspect(nList));

  

 
posted @ 2019-06-11 15:35  不知不觉、  阅读(252)  评论(0编辑  收藏  举报