146.LRU缓存 使用双向链表和哈希表来实现LRU缓存
`
class LRUCache{
class LinkedNode{
int key;
int value;
LinkedNode next;
LinkedNode prev;
public LinkedNode(){}
public LinkedNode(int key, int value){
this.key = key;
this.value = value;
}
private Map<Integer, LinkedNode> map = new HashMap<>();
private LinkedNode head; //头节点
private LinkedNode tail; //尾节点
private int size;
private int capacity;
public LRUCache(int capacity) {
this.size = 0; //当前容量
this.capacity = capacity; //最大容量
head = new LinkedNode(); //头节点
tail = new LinkedNode(); //尾节点
head.next = tail;
tail.prev = head;
}
public int get(int key) {
LinkedNode linkedNode = map.get(key);
if (linkedNode == null) {
return -1;
}
moveToFirst(linkedNode);
return linkedNode.value;
}
public void put(int key, int value) {
LinkedNode node = new LinkedNode(key, value);
LinkedNode node1 = map.get(key);
if(node1 != null){
remove(node1);
putFirst(node);
}
if(size < capacity){
map.put(key, new LinkedNode(key, value));
putFirst(new LinkedNode(key, value));
size++;
}else {
map.put(key, new LinkedNode(key, value));
LinkedNode last = tail.prev;
map.remove(last.key);
removeLast();
putFirst(new LinkedNode(key, value));
}
}
// 在首部加节点
public void putFirst(LinkedNode node){
LinkedNode temp = head.next;
head.next = node;
node.prev = head;
node.next = temp;
temp.prev = node;
}
//删除节点
public void remove(LinkedNode node){
LinkedNode prev = node.prev;
LinkedNode next = node.next;
prev.next = next;
next.prev = prev;
}
//移到最前
public void moveToFirst(LinkedNode node){
remove(node);
putFirst(node);
}
//移除掉最后一个节点
public void removeLast(){
LinkedNode temp = tail.prev;
LinkedNode prev = temp.prev;
prev.next = tail;
tail.prev = prev;
}
}
`
浙公网安备 33010602011771号