链表

 

 链表

 概念: 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。下图展

 示了一个链表的结构:

创建链表

function LinkedList() {
  let Node = function(element){ // {1}需要一个Node辅助类
    this.element = element;
    this.next = null;
  };
  let length = 0; // {2}存储列表项的数量的length属性
  let head = null; // {3}存储第一个节点的引用
  // 向链表尾部追加元素
  this.append = function(element) {
    let node = new Node(element), //{1}把element作为值传入,创建Node项
        current; //{2}
    if (head === null){ //列表中第一个节点 //{3}
      head = node;
    } else {
      current = head; //{4}
      //循环列表,直到找到最后一项
      while(current.next){
        current = current.next;
      }
      //找到最后一项,将其next赋为node,建立链接
      current.next = node; //{5}
    }
    length++; //更新列表的长度 //{6}
  };
  
  // 在任意位置插入元素
  this.insert = function(position, element){
    //检查越界值
    if (position >= 0 && position <= length){ //{1}
      let node = new Node(element),
          current = head,
          previous,
          index = 0;
      if (position === 0){ //在第一个位置添加
        node.next = current; //{2}是把node.next的值设为current
        head = node;//把head的引用改为node
      } else {
        while (index++ < position){ //{3}需要循环访问列表,找到目标位置
          previous = current;
          current = current.next;
        }
        node.next = current; //{4}把新项(node)和当前项链接起来
        previous.next = node; //{5}让previous.next指向node
      }
      length++; //更新列表的长度
      return true;
    } else {
      return false; //{6}没有添加项到列表中
    }
  };

  // 从链表中移除元素
  this.removeAt = function(position) {
    //检查越界值
    if (position > -1 && position < length) { // {1}验证这个位置是否有效
      let current = head, // {2}创建一个对列表中第一个元素的引用
          previous, // {3}一个对当前元素的前一个元素的引用
          index = 0; // {4}
      //移除第一项
      if (position === 0){ // {5}如果想移除第一个元素,要做的就是让head指向列表的第二个元素
        head = current.next;
      } else {
        while (index++ < position){ // {6}
          previous = current; // {7}
          current = current.next; // {8}变量总是为对所循环列表的当前元素的引用
        }
        //将previous与current的下一项链接起来:跳过current,从而移除它
        previous.next = current.next; // {9}要从列表中移除当前元素,要做的就是将previous.next和current.next链接起来
      }
      length--; // {10}
      return current.element;
    } else {
      return null; // {11}
    }
  };
this.indexOf = function(element){ let current = head, //{1} index = -1; while (current) { //{2} if (element === current.element) { return index; //{3}检查当前元素是否是我们要找的。如果是,就返回它的位置 } index++; //{4}如果不是,就继续计数 current = current.next; //{5}检查列表中下一个节点 } return -1; }; this.isEmpty = function() { return length === 0; };
this.size = function() { return length; };
this.getHead = function(){ return head; };
this.toString = function(){ let current = head, //{1} string = ''; //{2} while (current) { //{3}循环访问列表中的每个元素 string +=current.element +(current.next ? 'n' : '');//{4}然后我们就得到了元素的内容,将其拼接到字符串中 current = current.next; //{5}最后,继续迭代下一个元素 } return string; //{6} }; }

 

1. 向链表尾部追加元素

     1.1 向为空的列表添加一个元素

   

    1.2 向列表的尾部添加一个元素

     

2.从链表中移除元素

    2.1 移除第一个元素

    2.2 移除第一个以外的任一元素

    

3.在任意位置插入元素

    3.1 需要在列表的起点添加一个元素

    3.2  在列表中间或尾部添加一个元素

     尾部:

    

 

    中间:

      

 

posted @ 2019-01-16 15:10  宇晴  阅读(351)  评论(0编辑  收藏  举报