持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
链表是一个动态的数据结构,没有扩容的操作;链表的意义在于:从开头Head每个链表都会有一个数据Data,还有一个指针Next它指向另外一个对象,另外一个对象也是这两个对象,往下推--直到最后一个数据只有一个Data,没有指针。
链表移除数据
链表删除指定元素,是把当前指定元素的指针前一位指向后一位,但如果删除头部元素和尾部元素,通过一般的链表删除操作,逻辑是不通的
- 定义哨兵元素 把链表元素的第一位进行提取
let data = {next:head}
let current = data;
- 循环
遍历链表元素的第一位元素,如果传递进来的值
value,等于删除元素的值那么它的下一个元素要被删除,把当前元素的指针指向删除元素的下一个元素
while(data.next.val == value){
data.next = data.next.next
}
思路:定义链表的第一个元素为哨兵元素,是把除了哨兵元素之外的元素用普通的增删改方法,这样简化了代码的逻辑
循环列表
在单向链表的基础上,进行循环,可以修改或者指向任意一个索引位置,这样增加了效率
环形链表
环形链表,每个都会有一个next和data,环形链表比单向链表占用了更多空间,但是它可以一直向前变化,在特殊场景下,删除指定节点和删除前面的几个节点都是很好的操作
链表跳表
调表是更高级的性能优化层面,它是在链表之外进行一些性能优化等操作;
思路:调表是在链表的基础上加上索引查找功能,常见的二分查找,通过每两个节点生成一个索引节点,再通过每两个索引再次生成一个索引进行查找