题目 实现 LRU
https://leetcode.com/problems/lru-cache/
题目大意 : 实现LRU 插入以及删除
题解:用HashMap + 双向带头尾节点的链表 或 LinkedHashMap
public class ListNode{
int key;
int val;
ListNode pre;
ListNode post;
ListNode(int x,int y){key = x; val = y;}
}
class LRUCache {
int capacity = 0;
int n=0;
Map<Integer,ListNode> map = new HashMap<>();
ListNode head = new ListNode(-1,-1); //创建头结点
ListNode end = new ListNode(-1,-1); //创建尾节点
public LRUCache(int capacity) {
this.capacity = capacity; //初始化容器规模
head.post = end; //头尾节点相连
end.pre = head;
}
public int get(int key) {
if(map.get(key) == null){
return -1;
}else{
ListNode node = map.get(key); //拿到节点
deleteNode(node); //断开连接
addHeadNode(node); //插入头部
return node.val;
}
}
public void put(int key, int value) {
if(map.get(key) == null){
ListNode node = new ListNode(key,value); //若不存在则创造节点
addHeadNode(node); //插入头部
map.put(key,node);
n++;
if(n > capacity){ //大于容量则删掉尾节点前一个节点
map.remove(end.pre.key); //map里面清除
deleteNode(end.pre); //删最后一个节点
}
}else{
ListNode node = map.get(key); //存在则取出更新值
node.val = value;
deleteNode(node); //断开连接
addHeadNode(node); //插入头部
}
}
void deleteNode(ListNode node){
node.pre.post = node.post;
node.post.pre = node.pre;
}
void addHeadNode(ListNode node){
node.pre = head;
node.post = head.post;
head.post.pre = node;
head.post = node;
}
}
class LRUCache {
private LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
private int capacity;
public LRUCache(int capacity) {
this.capacity = capacity;
}
public int get(int key) {
if (!map.containsKey(key)) return -1;
Integer val = map.get(key);
put(key, val);
return val;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
map.remove(key);
} else if (map.size() == capacity) {
map.remove(map.keySet().iterator().next());
}
map.put(key, value);
}
}