package 剑指offer.哈希表;
import java.util.HashMap;
public class leetcode146LRU缓存 {
//定义一个双端链表
class ListNode{
public int key;
public int value;
public ListNode prev;
public ListNode next;
//构造函数
public ListNode(int k ,int v){
this.key = k;
this.value = v;
}
}
class LRUCache {
int capcity;
HashMap<Integer, ListNode> hashMap;
//定义头尾节点
ListNode head;
ListNode tail;
public LRUCache(int cap) {
this.capcity = cap;
this.hashMap = new HashMap<>();
this.head = new ListNode(-1, -1);
this.tail = new ListNode(-1, -1);
head.next = tail;
tail.prev = head;
}
public int get(int key) {
ListNode node=hashMap.get(key);
if(node==null){
return -1;
}
movetotail(node,node.value);
return node.value;
}
public void put(int key, int value) {
if(hashMap.containsKey(key)){ //是有这个键的
ListNode node = hashMap.get(key);
movetotail(node, value); //更新新值
}else { //如果说hashmap是没有的,那么就需要删除
if(hashMap.size()==capcity){//说明已经满了
ListNode delete_node=head.next;
deletenode(delete_node);//删除头结点的下一个节点
hashMap.remove(delete_node.key);//hashmap中移除掉
}
ListNode newnode = new ListNode(key,value);
inserttotail(newnode);
hashMap.put(key,newnode);
}
}
public void movetotail(ListNode node, int value) {
deletenode(node);
node.value = value;
inserttotail(node);
}
public void deletenode(ListNode node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
//插入到
public void inserttotail(ListNode node) {
//插入到头结点
tail.prev.next =node;
node.prev = tail.prev;
tail.prev = node;
node.next= tail;
}
}
}
leetcode146 手写LRU算法
最新推荐文章于 2024-07-25 14:31:34 发布