js的数据结构01:链表理解和增加

185 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

什么是链表

链表是一个动态的数据结构,没有扩容的操作;链表的意义在于:从开头Head每个链表都会有一个数据Data,还有一个指针Next它指向另外一个对象,另外一个对象也是这两个对象,往下推--直到最后一个数据只有一个Data,没有指针。

链表和数组的区别

数组是一个静态的数据结构,新建好之后,它的内存就已经固定好了,它的优点是可根据索引(下标)精准的查到数据,这是数组在内存中连续存储的特性。

无标题.png

如果把某一个数据删掉,删掉后会多出一个空位,所以删除数据后面的所有数据都会往前补一位,如果是增加一位(插入一位),则需要先扩容,在扩容位置后面的所有数据则需要往后移一位

所以它的新增和删除复杂度较高,这是数组的特性所决定的

链表新增数据

链表的数据结构,在JavaScript中是没有自带的,需要去模拟链表的过程,比如新建一个函数function和类Class

class NodeList{
  constructor(){}
}

新建Node类,这里接收每个传入的链表数据,在内接收它的数据data和指针next

class Node{
  constructor(data,next){
    this.data = data
    this.next = null
  }
}

constructor中设置链表的相关操作,增删改查,设置它的头部和总长度这样就不用单独设置数量。

class NodeList{
  constructor(){
    this.head = null
    this.length = 0
  }
}
  • 增加 增加需要新建节点信息,并且需要判断是否为空,如果为空则将新建Node信息传给Head头部,如果不是则遍历链表指针,证明它是有数据
  append(data){
    let node = new Node(data)
    let cur;
    if(this.head == null){
      this.head = node
    }else{
      cur = head
      while(cur.next){
        cur = cur.next
      }
      cur.next = node
    }
    this.length += 1
  }

最后把链表指针进行赋值操作,遍历到最后为Null时,则把指针指向为Node新建节点信息,所有操作完成后,把总长度加一个长度,方便统计