LRU 缓存机制 - 数据结构的实现

  1. class LRUCache {
  2. class Node{
  3. int key;
  4. int val;
  5. Node next;
  6. Node pre;
  7. Node(){}
  8. Node(int key, int val){
  9. this.key = key;
  10. this.val = val;
  11. }
  12. }
  13. Node first;
  14. Node last;
  15. Map<Integer, Node> map;
  16. int capacity;
  17. public LRUCache(int capacity) {
  18. this.first = new Node();
  19. this.last = new Node();
  20. first.next = last;
  21. last.pre = first;
  22. this.map = new HashMap<>();
  23. this.capacity = capacity;
  24. }
  25. public int get(int key) {
  26. Node node = map.get(key);
  27. if(node == null) return -1;
  28. getNode(node);
  29. moveToHead(node);
  30. return node.val;
  31. }
  32. public void put(int key, int value) {
  33. Node node = map.get(key);
  34. if(node != null){
  35. node.val = value;
  36. getNode(node);
  37. moveToHead(node);
  38. }else{
  39. if(map.size() == capacity){
  40. map.remove(last.pre.key);
  41. getNode(last.pre);
  42. }
  43. node = new Node(key, value);
  44. map.put(key, node);
  45. moveToHead(node);
  46. }
  47. }
  48. public void getNode(Node node){
  49. node.pre.next = node.next;
  50. node.next.pre = node.pre;
  51. }
  52. public void moveToHead(Node node){
  53. node.next = first.next;
  54. first.next.pre = node;
  55. node.pre = first;
  56. first.next = node;
  57. }
  58. }

自己处理输入输出

[

](https://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61?tpId=188&&tqId=35312&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking)