题目链接:https://leetcode-cn.com/problems/lru-cache/ 解法分析:LRU 经典模拟题,使用双链表 + 哈希组合的方法解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 var DoubleLinkedListNode = function (key, value ) { this .key = key; this .value = value; this .prev = null ; this .next = null ; } var LRUCache = function (capacity ) { this .capacity = capacity; this .map = new Map (); this .dummyHead = new DoubleLinkedListNode(null , null ); this .dummyTail = new DoubleLinkedListNode(null , null ); this .dummyHead.next = this .dummyTail; this .dummyTail.prev = this .dummyHead; }; LRUCache.prototype._isFull = function ( ) { return this .map.size === this .capacity; } LRUCache.prototype._removeNode = function (node ) { node.prev.next = node.next; node.next.prev = node.prev; node.prev = null ; node.next = null ; return node; } LRUCache.prototype._addToHead = function (node ) { const head = this .dummyHead.next; node.next = head; head.prev = node; node.prev = this .dummyHead; this .dummyHead.next = node; } LRUCache.prototype.get = function (key ) { if (this .map.has(key)) { const node = this .map.get(key); this ._addToHead(this ._removeNode(node)); return node.value; } else { return -1 ; } }; LRUCache.prototype.put = function (key, value ) { if (this .map.has(key)) { const node = this .map.get(key); node.value = value; this ._addToHead(this ._removeNode(node)); } else { if (this ._isFull()) { const node = this .dummyTail.prev; this .map.delete(node.key); this ._removeNode(node); } const node = new DoubleLinkedListNode(key, value); this .map.set(key, node); this ._addToHead(node); } };