js的数据结构02:链表的删除

99 阅读2分钟

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

链表

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

链表的删除

链表新增数据和删除数据时,不用修改之前数组的完整的移动位置,而是动态进行扩容,这就是它为什么是动态数据结构,不用像数组一样,新增和删除数据要移动。

  1. 创建一个newNodeList的集合(模拟增加后删除的效果),在内添加数据,最后并调用删除方法。
let nodeTemp = newNodeList()
nodeTemp.append('hello')
nodeTemp.removeAt(1)
  1. NodeList类中,添加removeAt删除方法并传入下标,思路:首先找到要删除的元素,把它的Next指针删掉,随后把它前一个元素指向它。
class NodeList{
    removeAt(index){
       let current = this.head
      let setTopNum;
    }
}

把当前Head开头,用current来取代正在遍历的链表节点,一开始的入口就是head节点

  1. 记录上下级节点和当前索引位置 思路:要记录把遍历的上一个节点,指向下一个节点,然后把自己的下一个节点指向取消,并放到当前类中
let setTopNum;
let y = 0;

等替换时需用到y变量,记录变换几次,根据这个则可记录循环判定条件

  1. 判断节点 如果传入的index位置为0的情况下,则删除第一项,把当前head指向第二位~
  if(index == 0){
    this.head = current.next
  }

如果传入位置不为0,需要进行循环查找,循环链表用的最多的是while,因为不确定到底有多少数据

while(y < index){
  setTopNum = current
  current = current.next
  index++
}

记录的节点y小于传入的index,那么说明它大于0,则需要把上一个的数据和当前数据分别进行保存,最后把记录次数增加。 5. 循环结束后,也找到当前要删除的位置,并把当前节点释放为空

setTopNum.next = current.next
current.next = null

最后

在删除中要考虑越界的情况,比如只有10个数据,那么传入的下标是100,则会报错