注:这里采用的是单链表+hashmap实现。效率没有双链表高。 双链表的插入删除都是O(1)
package 腾讯笔试;
import java.util.HashMap;
import java.util.Map;
/**
* @author YJS
* @date 2020/8/26 10:11
*/
public class LRUCache {
class DLinkedNode {
int key;
int value;
DLinkedNode prev;
DLinkedNode next;
public DLinkedNode() { }
public DLinkedNode(int key,int value) {
this.key = key;
this.value = value;
}
}
private Map<Integer, DLinkedNode> map = new HashMap<>();
private int size;
private int capacity;
private DLinkedNode head, tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
DLinkedNode node = map.get(key);
if(node==null) return -1;
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
DLinkedNode node = map.get(key);
if (node == null) {
DLinkedNode newNode = new DLinkedNode(key, value);
map.put(key, newNode);
addToHead(newNode);
++size;
if (size > capacity) {
DLinkedNode remNode = removeTail();
map.remove(remNode.key);
}
} else {
node.value = value;
moveToHead(node);
}
}
private DLinkedNode removeTail() {
DLinkedNode node = tail.prev;
removeNode(node);
return node;
}
private void moveToHead(DLinkedNode node) {
removeNode(node);
addToHead(node);
}
private void removeNode(DLinkedNode node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void addToHead(DLinkedNode node) {
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
}