链表与数组

数组是一串有序的排列

而链表中不能间接以下标为索引取值

链表类的实现

1、定义一个类,自带属性要有长度和头部

class LinkList {    constructor() {      this.length = 0      this.head = null    }}

2、须要有个查找办法,前面增删改也会须要用到

getElementAt(position) {    // 做个校验提高效率    if (position < 0 || position >= this.length)       return null        let current = this.head    for (let i = 0; i < position ; i++) {      // 赋值为下一个节点      current = current.next    }    // 循环完结,找到指标节点返回    return current}

3、新增节点的办法

这里须要个辅助类 -- 节点类
class Node {    constructor(element) {      this.element = element      this.next = null    }}
新增办法
append(element) {    let node = new Node(element)    // 如果是空链表    if (this.head === null) {      this.head = node    } else {      // 找到最初一个元素      let current = this.getElementAt(this.length - 1)      current.next = node    }    this.length++}

3、插入方法

insert(position, element) {    if (position < 0 || position > this.length)      return false    let node = new Node(element)    if (position === 0) {      node.next = this.head      this.head = node    } else {      // 找到上一个的地位      let previous = this.getElementAt(position - 1)      // 1 -> 3 =>> 2 -> 3      node.next = previous.next      // 1 -> 2      previous.next = node      // 1 -> 2 -> 3    }    this.length++    return true}

4、移除办法

removeAt(position) {    if (position < 0 || position > this.length)       return false    let current = this.head    if (position === 0) {      this.head = current.next    } else {      // 找到索引值上一个      let previous = this.getElementAt(positoin - 1)      // 找到索引值, 2      current = previous.next      // 索引值的上一个间接指向索引值的下一个,也就是跳过索引值      // 1 -> 2 -> 3 =>> 1 -> 3      previous.next = current.next    }    this.length--    return current.element}

5、依据值查找索引

indexOf(element) {    let current = this.head    for(let i = 0; i < this.length; i++) {      if (current.element === element)        return i      current = current.next    }    return -1}
残缺代码
class LinkList {  constructor() {    this.length = 0;    this.head = null; // 能够用作链表是否为空的判断  }  getElementAt(position) {    if (position < 0 || position >= this.length) return null;    let current = this.head;    for (let i = 0; i < position; i++) {      current = current.next;    }    return current;  }  append(element) {    let node = new Node(element);    if (this.head == null) {      this.head = node;    } else {      let current = this.getElementAt(this.length - 1);      current.next = node;    }    this.length++;  }   insert(position, element) {    if (position < 0 || position > this.length) return false;    let node = new Node(element);    if (position === 0) {      node.next = this.head;      this.head = node;    } else {      let previous = this.getElementAt(position - 1);      node.next = previous.next;      previous.next = node;    }    this.length++;    return true;  }  removeAt(position) {    if (position < 0 || position > this.length) return false;    let current = this.head;    if (position === 0) {      this.head = current.next;    } else {      let previous = this.getElementAt(position - 1);      current = previous.next;      previous.next = current.next;    }    this.length--;    return current.element;  }   indexOf(element) {    let current = this.head;    for (let i = 0; i < this.length; i++) {      if (current.element === element) return i;      current = current.next;    }    return -1;  }}class Node {  constructor(element) {    this.element = element    this.next = null  }}