1. 链表与LRU缓存的核心原理
链表作为基础数据结构,在LRU(Least Recently Used)缓存淘汰算法中扮演着关键角色。这种组合在操作系统页面置换、数据库缓存池、Redis内存管理等场景随处可见。理解这个组合的运作机制,是每个合格开发者必须掌握的硬核技能。
链表实现LRU的核心在于:最新访问的数据始终位于链表头部,最久未使用的数据自然沉淀到尾部。当缓存空间不足时,直接淘汰尾节点即可。这种设计完美利用了链表的动态增删特性——头部插入和尾部删除都能在O(1)时间复杂度内完成。
关键点:双向链表+哈希表的组合才是工业级实现。链表维护访问时序,哈希表提供O(1)访问能力。单纯用链表会导致查询效率降为O(n)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双向链表+哈希表的黄金组合
2.1 数据结构设计
cpp复制struct DLinkedNode {
int key, value;
DLinkedNode* prev;
DLinkedNode* next;
DLinkedNode(): key(0), value(0), prev(nullptr), next(nullptr) {}
DLinkedNode(int _key, int _value): key(_key), value(_value), prev(nullptr), next(nullptr) {}
};
class LRUCache {
private:
unordered_map<int, DLinkedNode*> cache;
DLinkedNode* head; // 虚拟头节点
DLinkedNode* tail; // 虚拟尾节点
int size;
int capacity;
}
虚拟头尾节点的设计让边界处理更优雅,避免了繁琐的空指针检查。哈希表存储键到节点的映射,使得我们可以直接定位到链表中的具体节点。
2.2 关键操作时间复杂度分析
| 操作 | 链表实现 | 链表+哈希实现 |
|---|---|---|
| 访问(get) | O(n) | O(1) |
| 插入(p |
