javascript数据结构与算法(笔记)---链表

//链表

    /*
    * LinkedList 数据结构还需要一个Node辅助类,Node类表示要加入列表的项,它包含一个element属性,
    * 即要添加到列表的值,以及一个next属性,即指向列表中下一个节点项的指针
    * append(element): 向列表尾部添加一个新的项
    * insert(position, element):在列表的特定位置插入一个新的项
    * removeAt(position):从列表的特定位置移除一项
    * remove(element):从列表中删除一项
    * indexOf(element):返回元素在列表中的索引,如果列表中没有该元素则返回-1
    * isEmpty():如果列表中不包含任何元素,返回true,否则返回false
    * size():返回列表包含的元素个数
    * toString():由于列表项用了Node类,就需要重写javascript对象默认的toString方法,让其只输出元素的值
    */

    function LinkedList() {
      var Node = function(element) {
        this.element = element;
        this.next = null; // 指向列表下一项的指针
      }

      var length = 0;//LinkedList类也有存储列表项的数量length属性(内部/私有变量)
      var head = null;// 存储第一个节点的引用,

      this.append = function(element) {
        // 向列表中添加项的时候,要考虑俩种情况:1、列表为空,此时添加的是列表中的第一个元素,2、列表不为空,向其追加元素
        var node = new Node(element), current;
        if(head === null) { // 列表中的一个节点
          head = node; // 列表最后一个节点的下一个元素始终是null
        }else {
          current = head;

          //循环列表,知道找到最后一项
          while(current.next) {
            current = current.next;
          }
          //找到最后一项,将其next赋值为node,建立链接
          current.next = node;
        }
        length++;
      };
      this.insert = function(position, element) {
        if(position > -1 && position <= length) {
          var node = new Node(element);
          current = head;
          previous, index = 0;
          if(position === 0) {
            node.next = current;
            head = node;
          } else {
            while(index++ < position) { //循环列表找到目标位置
              previous = current;
              current = current.next;
            }
            node.next = current;
            previous.next = node;
          }
          length++;
          return true;
        }else {
          return false;
        }
      };

      // 移除元素有俩种情景:1、移除第一个元素;2、移除第一个元素以外的任一元素;
      this.removeAt = function(position) {
        // 检查越界值
        if(position > -1 && position < length) {
          var current = head, previous, index = 0;
          // current是要移除元素的引用,previous是对要移除元素的前一个元素的引用,移除current,需要做的是将previous.next 与 current.next链接起来
          // 移除第一项
          if(position === 0) {
            head = current.next;
          }else {
            while(index++ < position) {
              previous = current;
              current = current.next;
            }

            // 将previous与current的下一项链接起来:跳过current,从而移除它
            previous.next = current.next;
          }
          length--;
          return current.element;
        }else {
          return null; // 不是有效位置,则返回null
        }
      };
      this.remove = function(element) {

      };
      this.indexOf = function (element) {
        var current = head, index = -1;
        while(current) {
          if(element === current.element) {
            return index;
          }
          index++;
          current = current.next;
        }
        return -1;
      };
      this.isEmpty = function() {
        return length === 0;
      };
      this.size = function() {
        return length;
      };
      this.toString = function() {
        var current = head, string = '';
        while(current) {
          string = current.element;
          current = current.next;
        }
        return string;
      };
      this.print = function() {};
      this.getHead = function() {
        return head;
      }
    }

    var linkedList = new LinkedList();
    linkedList.append(15);
    linkedList.append(10);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值