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。
数据结构:双链表、hashmap
双链表我们只需要定义删除结点操作和将结点插入到队首两个操作;
当调用getKey时,若为null则返回-1,否则返回此结点的值,并将该结点插入队首,代表最近刚刚使用;
调用setKey时,若为null则需要加入新key,此时判断capacity是否超标,超标删除链表队尾结点,若不为null需要更新此结点的值,并将此节点插入到队首。
参考:https://discuss.leetcode.com/topic/34701/java-easy-version-to-understand/2
代码:
public class LRUCache { int capacity; Map<Integer,Node> map; Node head; Node tail; int nums; class Node{ public Node(int key,int val){ this.key=key; this.value=val; } int key; int value; Node pre; Node next; } public LRUCache(int capacity) { this.capacity=capacity; map=new HashMap<>(); head=new Node(-1,-1); tail=new Node(-1,-1); head.next=tail; tail.pre=head; this.nums=0; } public void DeleteNode(Node node){ node.pre.next=node.next; node.next.pre=node.pre; } public void addToHead(Node node){ node.next=head.next; head.next.pre=node; head.next=node; node.pre=head; } public int get(int key) { Node node=map.get(key); if(node!=null){ DeleteNode(node); addToHead(node); return node.value; } else return -1; } public void set(int key, int value) { if(map.get(key)==null){ Node node = new Node(key, value); map.put(key,node); if(nums<capacity) { nums++; addToHead(node); } else{ map.remove(tail.pre.key); DeleteNode(tail.pre); addToHead(node); } } else{ Node node=map.get(key); node.value=value; DeleteNode(node); addToHead(node); } } }