package LRUtype LRUCache struct { head *Node tail *Node Map map[int]*Node cap int}type Node struct { key int value int next *Node prev *Node}func newNode(k, v int) *Node { return &Node{ key: k, value: v, }}func Constructor(capacity int) LRUCache { l := LRUCache{ head: newNode(0, 0), tail: newNode(0, 0), Map: make(map[int]*Node), cap: capacity, } l.head.next = l.tail l.tail.prev = l.head return l}func (this *LRUCache) Get(key int) int { v, ok := this.Map[key] if !ok { return -1 } this.moveToTail(v, v.value) return v.value}func (this *LRUCache) Put(key int, value int) { _, ok := this.Map[key] if ok { this.moveToTail(this.Map[key], value) } else { if len(this.Map) == this.cap { toBeDelete := this.head.next this.deleteNode(toBeDelete) delete(this.Map, toBeDelete.key) } node := newNode(key, value) this.Map[key] = node this.insertToTail(node) }}func (this *LRUCache) moveToTail(node *Node, newValue int) { this.deleteNode(node) node.value = newValue this.insertToTail(node)}func (this *LRUCache) deleteNode(node *Node) { node.prev.next = node.next node.next.prev = node.prev}func (this *LRUCache) insertToTail(node *Node) { this.tail.prev.next = node node.prev = this.tail.prev node.next = this.tail this.tail.prev = node}