package LRU缓存;import java.util.Arrays;
import java.util.HashMap;//建立一个双向队列
class MyQueueNode{int key;int value;MyQueueNode pre;MyQueueNode next;public MyQueueNode(int key,int value){this.key = key;this.value=value;}
}
class MyQueue{MyQueueNode head;MyQueueNode tail;public MyQueue(){head=new MyQueueNode(-1,-1);tail=new MyQueueNode(-1,-1);head.next=tail;tail.pre=head;}
}
//最近最少使用
public class LRUCache {int capacity;MyQueue myQueue;HashMap<Integer, MyQueueNode> hashMap;public LRUCache(int capacity) {this.capacity=capacity;myQueue=new MyQueue();hashMap = new HashMap<>();}public int get(int key) {if (!hashMap.containsKey(key)){return -1;}MyQueueNode node = hashMap.get(key);//已经使用了要将这个节点插入至队列的末尾removeNode(node);insertIntoTail(node);return node.value;}//更换至末尾public void insertIntoTail(MyQueueNode node) {node.pre=myQueue.tail.pre;myQueue.tail.pre.next=node;node.next=myQueue.tail;myQueue.tail.pre=node;}public void removeNode(MyQueueNode node){node.next.pre=node.pre;node.pre.next=node.next;}public void put(int key, int value) {if (get(key)!=-1){//存在hashMap.get(key).value=value;}else{//超过容量 移除头节点if (hashMap.size()>=capacity){MyQueueNode node = myQueue.head.next;hashMap.remove(node.key);removeNode(myQueue.head.next);}//新增节点MyQueueNode newNode = new MyQueueNode(key,value);hashMap.put(key,newNode);insertIntoTail(newNode);}}
}