力扣146.LRU缓存c++
时间: 2025-05-18 22:06:48 浏览: 18
### LeetCode 146 LRU Cache 的 C++ 实现
LRU(Least Recently Used)是一种常见的缓存淘汰策略,用于管理固定大小的内存空间。当缓存满时,会移除最近最少使用的数据项以腾出空间。
以下是基于双向链表和哈希表实现的 C++ 解决方案:
#### 双向链表节点定义
为了高效地维护访问顺序并快速更新节点位置,可以使用自定义的 `ListNode` 类来表示双向链表中的节点。
```cpp
struct ListNode {
int key;
int value;
ListNode* prev;
ListNode* next;
ListNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};
```
#### 缓存类设计
通过组合哈希表和双向链表,可以在 O(1) 时间复杂度下完成插入、删除以及查找操作。
```cpp
class LRUCache {
private:
unordered_map<int, ListNode*> map; // 哈希表存储键到节点指针的映射关系
ListNode* head; // 虚拟头结点
ListNode* tail; // 虚拟尾结点
int capacity; // 容量上限
public:
LRUCache(int cap) : capacity(cap) {
head = new ListNode(-1, -1); // 初始化虚拟头部
tail = new ListNode(-1, -1); // 初始化虚拟尾部
head->next = tail; // 连接首尾
tail->prev = head;
}
~LRUCache() {
ListNode* cur = head;
while (cur != nullptr) {
ListNode* temp = cur;
cur = cur->next;
delete temp;
}
}
void removeNode(ListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
void addToHead(ListNode* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
int get(int key) {
if (!map.count(key)) return -1; // 如果不存在该key,则返回-1
ListNode* node = map[key];
removeNode(node);
addToHead(node);
return node->value;
}
void put(int key, int value) {
if (map.count(key)) { // 若已存在则更新其值并将它移到最前面
ListNode* node = map[key];
node->value = value;
removeNode(node);
addToHead(node);
return;
}
if (map.size() >= capacity) { // 当容量达到上限时,移除最后未被使用的节点
ListNode* lastUsed = tail->prev;
removeNode(lastUsed);
map.erase(lastUsed->key);
delete lastUsed;
}
ListNode* newNode = new ListNode(key, value); // 创建新节点并加入hashMap与链表前端
map[key] = newNode;
addToHead(newNode);
}
};
```
上述代码实现了基本功能[^3],其中包含了以下几个核心部分:
- **removeNode**: 将指定节点从当前列表中移除。
- **addToHead**: 把某个节点移动至链表开头的位置。
- **get 方法**: 获取对应 key 的值,并将其标记为最新访问过的项目。
- **put 方法**: 插入新的键值对或者覆盖已有条目;如果超出设定的最大数量限制,则清除掉最早之前加载的数据记录。
此版本的时间效率较高,在每次调用 `get()` 或者 `set()` 函数时都能保持常数级时间性能表现[^4]。
阅读全文
相关推荐









