利用js实现的数据结构知识整理---链表篇

最近复习了一些数据结构,正好看到一套结合前端的数据结构学习视频,学完感觉领悟了不少。打算记录记录,内容比较多,每天记录一些,当作二次复习。主要有一下数据结构:

  • 链表
  • 栈和队列
  • 集合和字典
  • 散列表

链表

线性表主要有顺序表和链表,这里主要说说链表。链表需要定义一个head来记录链表,每个链表上的节点node,都有一个element和next,element记录自身的内容,next记录了该节点的下一个节点。
链表实现的方法:append(element) 在尾部添加元素、insert(pos, element) 在指定位置插入元素、indexOf() 获取元素在链表中的位置、removeAt(pos)根据位置的删除对应的元素、remove(elemnet)根据位置的删除对应的元素、getHead() 获取链表

var LinkedList = function(){
	var head = null;  //初始化为null
	var Node = function(element){
		this.value = value;
		this.next = null;  //next初始化为null
	}
	 //在尾部添加元素
  this.append = function(element){
    var node = new Node(element)
    
    if(head == null){  //若栈空,直接head = element
      head = node;
    } 
    else{   //若栈不空,找到到栈最后一项插入元素
      var current = head;
      while(current.next){
        current = current.next;
      }
      current.next = node;
    }
    length++; //每添加一个元素,长度+1
  }
  //在pos位置上插入节点element
  this.insert = function(pos,element){
    //考虑越界,pos不能小于0,也不能大于链表长度
    if(pos > -1 && pos < length){
      var node = new Node(element);
      var current = head;
      if(pos == 0){    //位置为0,相当于在链表头插入节点
        head = node;
        node.next = current;
      }
      else{
        var previous = null; 
        var index = 0; 
        while(index < pos){  //一直到pos这个位置跳出循环
          previous = current; //记录前一个节点
          current = current.next;
          index++;
        } 
        node.next = current;
        previous.next = node;
      }
      length ++;  //插入一个节点,链表长度+1
    }
  }
  //获取节点在链表中的位置
  this.indexOf = function(element){
    var index = 0;
    var current = head;
    while(current){
      if(current.element == element){  //如果找到当前元素,跳出循环
        return index;
      }
      current = current.next;
      index ++;
    }
    return -1; //找不到返回-1
  }
   //根据位置删除节点
  this.removeAt = function(pos){
    //考虑越界,pos不能小于0,也不能大于链表长度
    if(pos > -1 && pos < length){
      var current = head;
      if(pos == 0){   //位置为0,相当于删除链表头的节点
        head = current.next;
      }
      else{
        var previous = null; //记录前一个节点
        var index = 0;
        while(index < pos){  //一直到pos这个位置跳出循环
          previous = current;
          current = current.next;
          index++;
        }
        previous.next = current.next;    //将当前位置的前一个节点的next,直接置成当前位置的下一个节点的值,相当于删除当前位置的节点
      }
      length--;  //删除一个节点,链表长度-1
      return current;
    }
    return -1;  //找不到返回-1
  }
  //根据元素删除节点
  this.remove = function(element){
   return this.removeAt(this.indexOf(element))
  }
  //获取链表长度
  this.size = function(){
    return length;
  }
  //判断链表是否为空
  this.isEmpty = function(){
    return length == 0;
  }
  //将链表置为空
  this.clear = function(){
    length = 0;
    head = null;
  }
  //获取链表
  this.getHead = function(){
    return head;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值