146. LRU cache mechanism interview questions 16.25. LRU cache
1 class LRUCache { 2 public class DlinkNode { 3 private int key; 4 private int val; 5 private DlinkNode right; 6 private DlinkNode left; 7 8 public DlinkNode() { 9 } 10 11 public DlinkNode(int key, int value) { 12 this.key = key; 13 this.val = value; 14 } 15 } 16 17 private Map<Integer, DlinkNode> map = new HashMap<>(); 18 private DlinkNode head = new DlinkNode(-1, -1); 19 private DlinkNode tail = new DlinkNode(-1, -1); 20 private int capacity; 21 22 public LRUCache(int capacity) { 23 this.capacity = capacity; 24 head.right = tail; 25 tail.left = head; 26 } 27 28 public int get(int key) { 29 if (map.containsKey(key)) { 30 DlinkNode node = map.get(key); 31 updateNode(node); //!!! 32 return map.get(key).val; 33 } else { 34 return -1; 35 } 36 } 37 38 public void put(int key, int value) { 39 if (map.containsKey(key)) { 40 DlinkNode node = map.get(key); 41 node.val = value; 42 updateNode(node); // !!! 注意更新结点位置 43 } else { 44 if (map.size() == capacity) { 45 removeFromHead(); 46 } 47 DlinkNode node = new DlinkNode(key, value); 48 addToTail(node); 49 } 50 } 51 52 public void removeFromHead() { 53 DlinkNode del = head.right; 54 map.remove(del.key); 55 head.right = del.right; 56 del.right.left = head; 57 del = null; 58 } 59 60 public void addToTail(DlinkNode node) { 61 map.put(node.key, node); 62 DlinkNode pre = tail.left; 63 pre.right = node; 64 node.left = pre; 65 node.right = tail; 66 tail.left = node; // !!! 忘记这一句,调了一下午 67 } 68 69 public void updateNode(DlinkNode node) { 70 DlinkNode left = node.left; 71 DlinkNode right = node.right; 72 left.right = right; 73 right.left = left; 74 addToTail(node); 75 } 76 }
460. LFU cache