力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
package Queue;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
class DLinkNode {
int key;
int value;
DLinkNode pre;
DLinkNode next;
public DLinkNode(int key, int value) {
this.key = key;
this.value = value;
}
public DLinkNode() {
}
@Override
public String toString() {
return "DLinkNode{" +
"key=" + key +
", value=" + value +
'}';
}
}
/*
利用hash+链表存储
get和put操作都算作是一次使用,把最新使用的节点放在头部
旧节点放在尾部,如果容量超出,删除最后一个节点
*/
public class LRUCache {
int capacity;
int size;
DLinkNode head, tail; //指向头部和尾部
HashMap<Integer, DLinkNode> map;
public static void main(String[] args) {
LRUCache lruCache = new LRUCache(2);
lruCache.put(1, 1);
lruCache.put(2, 2);
lruCache.put(3, 3);
lruCache.get(2);
lruCache.put(4, 4);
lruCache.trverse();
}
public LRUCache(int capacity) {
this.capacity = capacity;
head = new DLinkNode();
tail = new DLinkNode();
head.next = tail;
tail.pre = head;
map = new HashMap();
}
void trverse() {
Set<Map.Entry<Integer, DLinkNode>> entries = map.entrySet();
for (Map.Entry m : entries) {
System.out.println(m.getKey() + " = " + m.getValue().toString());
}
}
//获取节点
public int get(int key) {
DLinkNode node = map.get(key);
if (node == null) {
return -1;
}
//如果存在,则把key添加到头部
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
DLinkNode node = map.get(key);
//如果node为空,执行添加操作
if (node == null) {
DLinkNode newNode = new DLinkNode(key, value);
map.put(key, newNode);
//把新节点添加到头部
addToHead(newNode);
++size;
//超出容量进行删除尾节点操作
if (size > capacity) {
DLinkNode tail = removeTail();
map.remove(tail.key);
--size;
}
} else {
//如果key存在,则更新key,并且移动到头部
node.value = value;
moveToHead(node);
}
}
public void addToHead(DLinkNode node) {
node.pre = head;
node.next = head.next;
head.next.pre = node;
head.next = node;
}
public void moveToHead(DLinkNode node) {
removeNode(node);
addToHead(node);
}
public void removeNode(DLinkNode node) {
node.pre.next = node.next;
node.next.pre = node.pre;
}
public DLinkNode removeTail() {
DLinkNode res = tail.pre;
removeNode(res);
return res;
}
}