LeetCode-146-LRU缓存机制

思路
考虑使用哈希表和双向链表来完成,哈希表记录双向链表存在的数据
代码
class LRUCache {
class LinkedNode {
int key;
int value;
LinkedNode pre;
LinkedNode next;
public LinkedNode() {}
public LinkedNode(int key, int value) {this.key = key; this.value = value;}
}//双向链表
int size;//实际长度
int capacity;//最大容量
LinkedNode head;//头节点
LinkedNode tail;//尾节点
Map<Integer,LinkedNode> cache=new HashMap<Integer,LinkedNode>();//哈希表,存储存在的数据
public LRUCache(int capacity) {
this.size=0;
this.capacity=capacity;
head=new LinkedNode();
tail=new LinkedNode();
head.next=tail;
tail.pre=head;
}
public int get(int key) {
LinkedNode node=cache.get(key);
if(node==null)return -1;//不存在返回-1
moveToHead(node);//移动到头节点,表示最近使用
return node.value;
}
//添加到头节点
void addToHead(LinkedNode node){
node.pre=head;
node.next=head.next;
head.next.pre=node;
head.next=node;
}
//移除节点
void removeNode(LinkedNode node){
node.pre.next=node.next;
node.next.pre=node.pre;
}
//移动到头节点
void moveToHead(LinkedNode node){
removeNode(node);//先把该节点从链表移除
addToHead(node);//添加到头节点
}
//移除使用次数最少
LinkedNode removeTail(){
LinkedNode node=tail.pre;
removeNode(node);//移除尾节点前一个
return node;
}
public void put(int key, int value) {
LinkedNode node=cache.get(key);
if(node==null){
node=new LinkedNode(key,value);
cache.put(key,node);
addToHead(node);//直接添加到头节点
size++;
//判断容量溢出,溢出则删除最后一个
if(size>capacity){
LinkedNode p=removeTail();
cache.remove(p.key);//同时删除哈希表中的记录
size--;
}
}
else{
node.value=value;
moveToHead(node);
}
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
本文讲解了如何使用哈希表和双向链表实现LeetCode中的LRU(Least Recently Used)缓存机制,通过构造LinkedNode类和关键方法如get、put和moveToHead来管理缓存的插入、删除和访问操作。适合理解哈希表与数据结构结合的实战应用。
938

被折叠的 条评论
为什么被折叠?



