标签:146 node 缓存 val int LRU key DoubleList public
class LRUCache {
class DoubleList{
public int key, val;
public DoubleList prev, next;
public DoubleList(){}
public DoubleList(int key, int val){
this.key = key;
this.val = val;
}
}
public HashMap<Integer, DoubleList> map = new HashMap<>();
public DoubleList head, tail;
public int size;
public int cap;
public LRUCache(int cap){
this.cap = cap;
this.size = 0;
head = new DoubleList();
tail = new DoubleList();
head.next = tail;
tail.prev = head;
}
public int get(int key){
// 不存在直接返回-1
if (!map.containsKey(key)){
return -1;
}
// 存在就返回值,并将该节点移到表头(先删除,再插入到表头)
turnToHead(map.get(key));
return map.get(key).val;
}
public void put(int key, int val){
DoubleList node = map.get(key);
if (node == null){ // 哈希表中不存在该元素
if (size == cap){ // 如果链表长度达到设定上限,就删除表尾元素,即最近最久未用元素
DoubleList nn = tail.prev;
removeNode(nn);
map.remove(nn.key);
size--;
}
DoubleList newNode = new DoubleList(key, val); // 新加入的元素要放在表头
map.put(key, newNode);
addFirst(newNode);
size++;
}else{ // 哈希表中存在该元素,直接修改元素的值,并放到表头
node.val = val;
turnToHead(node);
}
}
public void removeNode(DoubleList node){ // 移除元素
node.prev.next = node.next;
node.next.prev = node.prev;
}
public void addFirst(DoubleList node){ // 把元素移到插入到表头
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
public void turnToHead(DoubleList node){ // 先删除,再插入表头
removeNode(node);
addFirst(node);
}
}
标签:146,node,缓存,val,int,LRU,key,DoubleList,public 来源: https://www.cnblogs.com/lchen-java/p/16408160.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。