2022-8-3 剑指offer-LRU数据结构-双向链表+哈希
运用所掌握的数据结构,设计和实现一个 LRU (Least Recently Used,最近最少使用) 缓存机制 。
实现 LRUCache
类:
LRUCache(int capacity)
以正整数作为容量capacity
初始化 LRU 缓存int get(int key)
如果关键字key
存在于缓存中,则返回关键字的值,否则返回-1
。void put(int key, int value)
如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
1 class LRUCache { 2 Map<Integer,Node> map; 3 Node head; 4 Node tail; 5 int size; 6 public LRUCache(int capacity) { 7 map=new HashMap<>(); 8 head=new Node(); 9 tail=new Node(); 10 head.next=tail; 11 tail.prev=head; 12 size=capacity; 13 } 14 15 public int get(int key) { 16 if (map.size()==0||!map.containsKey(key)) return -1; 17 Node node=map.get(key); 18 removeNode(node); 19 addNode(node); 20 map.put(key,node); 21 return node.val; 22 } 23 24 public void put(int key, int value) { 25 if (!map.containsKey(key)){ 26 if (map.size()>=size){ 27 Node del=tail.prev; 28 map.remove(del.key); 29 removeNode(del); 30 } 31 Node node=new Node(key,value); 32 addNode(node); 33 map.put(key,node); 34 }else{ 35 Node node=map.get(key); 36 removeNode(node); 37 node.val=value; 38 addNode(node); 39 map.put(key,node); 40 } 41 } 42 43 //头部插入新的 44 public void addNode(Node node){ 45 node.prev=head; 46 node.next=head.next; 47 head.next.prev=node; 48 head.next=node; 49 } 50 51 //去掉节点 52 public void removeNode(Node node){ 53 Node p=node.prev; 54 Node n=node.next; 55 p.next=n; 56 n.prev=p; 57 } 58 } 59 60 61 class Node{ 62 int key; 63 int val; 64 Node prev; 65 Node next; 66 Node(){ 67 } 68 Node(int key,int val){ 69 this.key=key; 70 this.val=val; 71 } 72 } 73 74 /** 75 * Your LRUCache object will be instantiated and called as such: 76 * LRUCache obj = new LRUCache(capacity); 77 * int param_1 = obj.get(key); 78 * obj.put(key,value); 79 */
思路:哈希加双向链表实现。