LRU Cache
问题描述
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value)
- Set or insert the value if the key is not
already present. When the cache reached its capacity, it should
invalidate the least recently used item before inserting a new item.
解决思路
双向链表。
程序
public class LRUCache { class Node { int key; int value; Node prev; Node next; public Node(int key, int value) { this.key = key; this.value = value; } } int capacity; Node head; Node tail; HashMap<Integer, Node> map; public LRUCache(int capacity) { this.capacity = capacity; this.head = new Node(-1, -1); this.tail = new Node(-1, -1); head.next = tail; tail.prev = head; this.map = new HashMap<Integer, Node>(); } public int get(int key) { if (map.containsKey(key)) { Node node = map.get(key); node.prev.next = node.next; node.next.prev = node.prev; moveToTail(node); return node.value; } return -1; } private void moveToTail(Node node) { tail.prev.next = node; node.prev = tail.prev; node.next = tail; tail.prev = node; } public void set(int key, int value) { if (get(key) != -1) { map.get(key).value = value; return; } if (map.size() == capacity) { Node first = head.next; map.remove(first.key); head.next = first.next; first.next.prev=head; } Node node = new Node(key, value); map.put(key, node); moveToTail(node); } }