146. LRU 缓存

  1. struct dListNode{
  2. dListNode* prev;
  3. dListNode* next;
  4. int key, value;
  5. dListNode():prev(nullptr), next(nullptr), key(0), value(0){};
  6. dListNode(int _key, int _value):prev(nullptr), next(nullptr), key(_key), value(_value){};
  7. };
  8. class LRUCache {
  9. private:
  10. unordered_map<int, dListNode*> hashmap;
  11. int capacity, size;
  12. dListNode* front;
  13. dListNode* back;
  14. public:
  15. LRUCache(int _capacity):capacity(_capacity), size(0){
  16. front = new dListNode();
  17. back = new dListNode();
  18. front->next = back;
  19. back->prev = front;
  20. }
  21. int get(int key) {
  22. if(!hashmap.count(key)){
  23. return -1;
  24. }
  25. dListNode* node = hashmap[key];
  26. moveTohead(node);
  27. return node->value;
  28. }
  29. void put(int key, int value) {
  30. if(hashmap.count(key)){
  31. dListNode* node = hashmap[key];
  32. node->value = value;
  33. moveTohead(node);
  34. }else{
  35. dListNode* node = new dListNode(key, value);
  36. addTohead(node);
  37. size ++;
  38. hashmap[key] = node;
  39. if(size > capacity){
  40. dListNode* tail = removeTail();
  41. size --;
  42. hashmap.erase(tail->key);
  43. delete tail;
  44. }
  45. }
  46. }
  47. void addTohead(dListNode* node){
  48. dListNode* nex = front->next;
  49. front->next = node;
  50. node->prev = front;
  51. node->next = nex;
  52. nex->prev = node;
  53. }
  54. void removeNode(dListNode* node){
  55. node->prev->next = node->next;
  56. node->next->prev = node->prev;
  57. }
  58. void moveTohead(dListNode* node){
  59. removeNode(node);
  60. addTohead(node);
  61. }
  62. dListNode* removeTail(){
  63. dListNode* tail = back->prev;
  64. removeNode(tail);
  65. return tail;
  66. }
  67. };