1.单链表实现LRU(O(n))
单向链表,从head出,tail进入(理解成队列,左进(tail)右出(head)。
* 查找:
1.查找:遍历得到这个数据对应的结点
2.移动:将其从原来的位置删除,然后再插入到链表的尾部
* 添加:查找 + (移动/删除)
- 缓存中已存在:移动到队尾
- 缓存中不存在:
- 缓存未满,则将此结点直接插入到链表的尾部
- 缓存已满,则链表**头结点删除**,将新的数据结点插入链表的尾部
* 删除:
1.查找:遍历找到要删除节点
2.删除:用前驱节点删除
这三个操作都要涉及“查找”操作。所以,如果单纯地采用链表的话,时间复杂度只能是 O(n)。
// 直接继承Java的LinkedList,就不用再自己实现链表
public class LinkedLRU extends LinkedList {
private int capcity;
public LinkedLRU (int capcity) {
this.capcity = capcity;
}
@Override
public boolean add(String str) {
// 如果队列中包含要添加元素
if (contains(str)) {
// 删除,然后再插入到队尾
remove(str);
/