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
| type LRUListNode struct { prev *LRUListNode next *LRUListNode key int val int }
type LRUList struct { head *LRUListNode tail *LRUListNode len int }
func makeLRUList() LRUList { head, tail := &LRUListNode{}, &LRUListNode{} head.next, tail.prev = tail, head return LRUList{head, tail, 0} }
func (lst *LRUList) moveToHead(node *LRUListNode) { prevNode, nextNode := node.prev, node.next prevNode.next, nextNode.prev = nextNode, prevNode
prevNode, nextNode = lst.head, lst.head.next node.prev, node.next = prevNode, nextNode prevNode.next, nextNode.prev = node, node }
func (lst *LRUList) pop() *LRUListNode { if lst.len == 0 { return nil } node := lst.tail.prev prevNode, nextNode := node.prev, node.next prevNode.next, nextNode.prev = nextNode, prevNode node.prev, node.next = nil, nil lst.len--
return node }
func (lst *LRUList) push(node *LRUListNode) { prevNode, nextNode := lst.head, lst.head.next node.prev, node.next = prevNode, nextNode prevNode.next, nextNode.prev = node, node lst.len++ }
type LRUCache struct { key2node map[int]*LRUListNode LRUList cap int }
func Constructor(capacity int) LRUCache { lst := makeLRUList() key2node := map[int]*LRUListNode{} return LRUCache{key2node, lst, capacity} }
func (this *LRUCache) Get(key int) int { if node, ok := this.key2node[key]; ok { this.moveToHead(node) return node.val }
return -1 }
func (this *LRUCache) Put(key int, value int) { if node, ok := this.key2node[key]; ok { this.moveToHead(node) node.val = value return }
for this.len >= this.cap { node := this.pop() delete(this.key2node, node.key) } node := &LRUListNode{key: key, val: value} this.push(node) this.key2node[key] = node }
|