JS实现的数据结构(一)--链表

345 阅读1分钟
// 节点构造函数
function Node (value) {
  this.next = null;
  this.value = value;
}

// 链表类
function LinkedList () {
  this.head = new Node('head');
  
  // 末尾加节点
  this.append = (value) => {
    let currentNode = this.head;
    while(currentNode.next) {
      currentNode = currentNode.next;
    }
    currentNode.next = new Node(value);
  }

  // 查找节点
  this.find = (value) => {
    let currentNode = this.head;
    while(currentNode && currentNode.value !== value) {
      currentNode = currentNode.next;
    }
    return currentNode;
  }

  // 插入节点
  this.insert = (prevNodeValue, value) => {
    const prevNode = this.find(prevNodeValue);
    if(prevNode) {
      const prevNext = prevNode.next;
      prevNode.next = new Node(value);
      prevNode.next.next = prevNext
    } else {
      console.log('没有找到要插入的节点')
    }
  }

  // 寻找一个节点的前一个节点
  this.findPrevNode = (value) => {
    let currentNode = this.head;
    while(currentNode.next && currentNode.next.value !== value) {
      currentNode = currentNode.next;
    }
    if(currentNode.next && currentNode.value !== 'head') {
      return currentNode;
    } else if(currentNode.value == 'head') {
      return currentNode;
    } else {
      console.log('没有找到当前节点');
      return null;
    }
  }

  // 删除节点
  this.remove = (value) => {
    const prevNode = this.findPrevNode(value);
    const originNextNode = prevNode.next.next;
    // const node = this.find(value);
    if(prevNode) {
      prevNode.next = originNextNode;
    }
  }

  // 展示链表
  this.show = () => {
    let currentNode = this.head.next;
    while(currentNode) {
      console.log(currentNode.value);
      currentNode = currentNode.next;
      if(currentNode) {
        console.log('↓');
      }
    }
  }
}

// 链表类的使用
var linkedList = new LinkedList();
linkedList.append(1);
linkedList.append(2);
linkedList.insert(1, 3);
linkedList.insert(2, 4);
linkedList.remove(2);
linkedList.remove(1);
linkedList.insert(3, 5);
linkedList.show();