持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
链表
链表是一个动态的数据结构,没有扩容的操作;链表的意义在于:从开头Head每个链表都会有一个数据Data,还有一个指针Next它指向另外一个对象,另外一个对象也是这两个对象,往下推--直到最后一个数据只有一个Data,没有指针。
链表的删除
链表新增数据和删除数据时,不用修改之前数组的完整的移动位置,而是动态进行扩容,这就是它为什么是动态数据结构,不用像数组一样,新增和删除数据要移动。
- 创建一个
newNodeList的集合(模拟增加后删除的效果),在内添加数据,最后并调用删除方法。
let nodeTemp = newNodeList()
nodeTemp.append('hello')
nodeTemp.removeAt(1)
- 在
NodeList类中,添加removeAt删除方法并传入下标,思路:首先找到要删除的元素,把它的Next指针删掉,随后把它前一个元素指向它。
class NodeList{
removeAt(index){
let current = this.head
let setTopNum;
}
}
把当前Head开头,用current来取代正在遍历的链表节点,一开始的入口就是head节点
- 记录上下级节点和当前索引位置 思路:要记录把遍历的上一个节点,指向下一个节点,然后把自己的下一个节点指向取消,并放到当前类中
let setTopNum;
let y = 0;
等替换时需用到y变量,记录变换几次,根据这个则可记录循环判定条件
- 判断节点
如果传入的
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,则会报错