• 链表


     链表

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

     示了一个链表的结构:

    创建链表

    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  在列表中间或尾部添加一个元素

         尾部:

        

        中间:

          

  • 相关阅读:
    深入了解C语言
    $_SERVER变量结构
    整理了一份招PHP高级工程师的面试题
    深入探究VC —— 编译器cl.exe(2)【转】http://blog.csdn.net/wangningyu/article/details/4837419
    vs2010 工程设置,调试中的目录问题【转】http://www.cnblogs.com/mlj318/archive/2011/10/09/2203510.html
    深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452
    移植ffmpeg到VC环境心得 【转】
    深入了解VC++编译器【转】
    VC2010中"Include Directories" 和 "Additional Include Directories"的区别
    深入探究VC —— 资源编译器rc.exe(3)【转】http://blog.csdn.net/wangningyu/article/details/4844687
  • 原文地址:https://www.cnblogs.com/ppxyq/p/10277134.html
Copyright © 2020-2023  润新知