es6 实现单链表

第一种
/*
* * 链表节点类 */ class Node { constructor(ele) { this.ele = ele; this.next = null; } } /** * 链表类 */ class NodeList { constructor(ele) { this.head = new Node(ele); //初始化链表的头节点 } findPreNode(item) { let currentNode = this.head; while (currentNode && currentNode.next && currentNode.next.ele !== item) { if (currentNode.next) { currentNode = currentNode.next; } else { currentNode = null; } } return currentNode; } findNode(item) { let currentNode = this.head; while (currentNode && currentNode.ele !== item) { if (currentNode.next) { currentNode = currentNode.next; } else { currentNode = null; } } return currentNode; } findLastNode() { let currentNode = this.head; while (currentNode.next) { currentNode = currentNode.next; } return currentNode; } append(newItem, preItem) { let newNode = new Node(newItem); if (preItem) { // 判读是否是插入到指定节点后面,如果不是则插入到最后一个节点。 let currentNode = this.findNode(preItem); newNode.next = currentNode.next; currentNode.next = newNode; } else { let lastNode = this.findLastNode(); lastNode.next = newNode; } } remove(item) { let preNode = this.findPreNode(item); // 找到前一节点,将前一节点的next指向该节点的next if (preNode.next != null) { preNode.next = preNode.next.next; } } toString() { let currentNode = this.head; let strList = []; while (currentNode.next) { strList.push(JSON.stringify(currentNode.ele)); currentNode = currentNode.next; } strList.push(JSON.stringify(currentNode.ele)); return strList.join(' ==> ') } } let A = { name: 'A', age: 10 }, B = { name: 'B', age: 20 }, C = { name: 'C', age: 30 }, D = { name: 'D', age: 40 }, E = { name: 'E', age: 50 }; let nList = new NodeList(A); nList.append(C); nList.append(B); nList.append(D); nList.append(E, A); console.log(" " + nList); nList.remove(C); console.log(" now " + nList)
origin: {"name":"A","age":10} ==> {"name":"E","age":50} ==> {"name":"C","age":30} ==> {"name":"B","age":20} ==> {"name":"D","age":40}
 now: {"name":"A","age":10} ==> {"name":"E","age":50} ==> {"name":"B","age":20} ==> {"name":"D","age":40}

 

第二种
/**
 * 链表节点类
 */
class Node {
  constructor (ele) {
    this.ele = ele;
    this.next = null;
  }
}
/**
 * 链表类
 */
class NodeList {
  constructor (ele) {
    this.head = null; // 初始化链表的头节点
    this.lenght = 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;
    }
    this.lenght++;
  }/**
   * 项链表某个位置插入元素
   * @param {*} position
   * @param {*} ele
   */
  insert (position, ele) {
    if (position >= 0 && position <= this.lenght) {
      let newNode = new Node(ele);
      let currentNode = this.head;
      let pre;
      let index = 0;
      if (position === 0) {
        newNode.next = currentNode;
        this.head = newNode;
      } else {
        while (index < position) {
          pre = currentNode;
          currentNode = currentNode.next;
          index++;
        }
        newNode.next = currentNode;
        pre.next = newNode;
      }
      this.lenght++;
    } else {
      return new Error('位置超出范围');
    }
  }
  removeAt (position) {
    if (position >= 0 && position < this.lenght) {
      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;
      }
      this.lenght--;
    } 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 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));
console.log(' origin: ' + nList);
nList.removeAt(2);
console.log(' now: ' + nList);

origin: {"name":"A","age":10} => {"name":"C","age":30} => {"name":"B","age":20} => {"name":"D","age":40} => {"name":"E","age":50} =>
now: {"name":"A","age":10} => {"name":"C","age":30} => {"name":"D","age":40} => {"name":"E","age":50} =>

 

转载于:https://www.cnblogs.com/xiaosongJiang/p/10878718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值