import java.util.*
/**
* LruCache
*/
public class Solution {
public static class Node{
public int key
public int value
public Node pre
public Node next
public Node(int key, int value) {
this.key = key
this.value = value
}
}
private int capacity
private int size = 0
private HashMap<Integer, Node> list = new HashMap<>()
private Node head = new Node(-1, -1)
private Node tail = new Node(-2, -2)
public Solution(int capacity) {
// write code here
this.capacity = capacity
head.next = tail
tail.pre = head
}
public int get(int key) {
// write code here
if (list.containsKey(key)) {
Node node = list.get(key)
removeNode(node)
moveToHead(node)
return node.value
} else {
return -1
}
}
//删除节点
private void removeNode(Node node) {
node.pre.next = node.next
node.next.pre = node.pre
}
//移动到队首
private void moveToHead(Node node) {
head.next.pre = node
node.next = head.next
node.pre = head
head.next = node
}
public void set(int key, int value) {
// write code here
if (list.containsKey(key)) {
Node node = list.get(key)
node.value = value
//需要先删除结点
removeNode(node)
//再移动到队首
moveToHead(node)
} else {
Node node = new Node(key, value)
list.put(key, node)
moveToHead(node)
size++
if (size > capacity) {
removeTail()
size--
}
}
}
//删除队尾
private void removeTail() {
Node node = tail.pre
list.remove(node.key)
tail.pre.pre.next = tail
tail.pre = tail.pre.pre
}
public static void main(String[] args) {
Solution s = new Solution(2)
s.set(1, 1)
s.set(2, 2)
System.out.println("get(1) : " + s.get(1))
s.set(3, 3)
System.out.println("get(2) : " + s.get(2))
s.set(4, 4)
System.out.println("get(1) : " + s.get(1))
System.out.println("get(3) : " + s.get(3))
System.out.println("get(4) : " + s.get(4))
}
}