算法与数据结构 | 链表 / 从链表到JS判断字符串回文
缓存淘汰策略
- 先进先出策略 FIFO(First In,First Out)
- 最少使用策略 LFU(Least Frequently Used)
- 最近最少使用策略 LRU(Least Recently Used)。
各种链表结构
-
底层的存储结构看
- 数组需要连续的、足够大的储存空间
- 链表不需要连续的内存空间,通过“指针”将一组零散的内存块串联起来
-
单链表
- 为了把所有的节点串起来,链表通过指针将一组零散的内存块串联起来;除了存储数据,好需要记录下一个节点【data|next】的方式,next成为后继指针next;
- 特殊的头结点–记录的链表的基地址
- 尾节点–指向一个空地址null;
-
链表插入和删除操作
- 和数组不一样,,删除链表不需要搬移节点,用我他们存储空间本来就不连续,只需要吧对应的next后继指针改变;删除操作和插入操作会比较快
- 弊端:访问第K个元素的时候,因为是非连续存储空间,无法通过下标访问的方式,需要遍历节点
-
循环链表
- 和单链表区别的就是首位相连
-
双向链表
- 【prev | data | next】的数据结构方式,每一个节点首尾能双向连接
- 删除操作会要比单向链表快,为什么呢?
- 双向链表记录了该节点的前去节点和后驱节点,删除操作不需要再想单向链表一样循环一次;
- 【prev | data | next】的数据结构方式,每一个节点首尾能双向连接
-
链表性能大比拼
知识拓展-判断字符串是否回文
- 字符串回文“abcba”,“moom”,这些都是回文的字符串,如何判断
- 首先思路分析:
- 首尾字符串相同
- 判断中间值
代码
- 以下代码是当下想到的思路,后续如果再灵光一闪,可能会继续优化。
function palindrome(str) {
// 取出数组长度
let length=str.length;
// 取出中位数
let half=Math.floor(length/2)-1;
for(var i=0;i<=half;i++){
// 数组开始到中位值和末尾开始到中位值的值需要相等
if(str[i]==str[length-1-i]){
console.log(str[i])
}else{
// 有一个不相等则可以判断字符串不回文
console.log("此字符串不回文");
break;
}
}
}
为什么字符串也可以使用下标访问?
- 写了一半,突然发现字符串也可以通过下标访问到,于是去看原因
- ES6-字符串的-Iterator-接口;因为字符串具备 Iterator 接口的数据结构;可以通过下标取值;
- 其他拥有相同结构的还有
- Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象