当前位置:   article > 正文

力扣HOT100 - 146. LRU缓存

力扣HOT100 - 146. LRU缓存

解题思路:

哈希表 + 双向链表

  1. public class LRUCache {
  2. class DLinkedNode {
  3. int key;
  4. int value;
  5. DLinkedNode prev;
  6. DLinkedNode next;
  7. public DLinkedNode() {}
  8. public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
  9. }
  10. private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
  11. private int size;
  12. private int capacity;
  13. private DLinkedNode head, tail;
  14. public LRUCache(int capacity) {
  15. this.size = 0;
  16. this.capacity = capacity;
  17. // 使用伪头部和伪尾部节点
  18. head = new DLinkedNode();
  19. tail = new DLinkedNode();
  20. head.next = tail;
  21. tail.prev = head;
  22. }
  23. public int get(int key) {
  24. DLinkedNode node = cache.get(key);
  25. if (node == null) {
  26. return -1;
  27. }
  28. // 如果 key 存在,先通过哈希表定位,再移到头部
  29. moveToHead(node);
  30. return node.value;
  31. }
  32. public void put(int key, int value) {
  33. DLinkedNode node = cache.get(key);
  34. if (node == null) {
  35. // 如果 key 不存在,创建一个新的节点
  36. DLinkedNode newNode = new DLinkedNode(key, value);
  37. // 添加进哈希表
  38. cache.put(key, newNode);
  39. // 添加至双向链表的头部
  40. addToHead(newNode);
  41. ++size;
  42. if (size > capacity) {
  43. // 如果超出容量,删除双向链表的尾部节点
  44. DLinkedNode tail = removeTail();
  45. // 删除哈希表中对应的项
  46. cache.remove(tail.key);
  47. --size;
  48. }
  49. }
  50. else {
  51. // 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
  52. node.value = value;
  53. moveToHead(node);
  54. }
  55. }
  56. private void addToHead(DLinkedNode node) {
  57. node.prev = head;
  58. node.next = head.next;
  59. head.next.prev = node;
  60. head.next = node;
  61. }
  62. private void removeNode(DLinkedNode node) {
  63. node.prev.next = node.next;
  64. node.next.prev = node.prev;
  65. }
  66. private void moveToHead(DLinkedNode node) {
  67. removeNode(node);
  68. addToHead(node);
  69. }
  70. private DLinkedNode removeTail() {
  71. DLinkedNode res = tail.prev;
  72. removeNode(res);
  73. return res;
  74. }
  75. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/482723
推荐阅读
相关标签
  

闽ICP备14008679号