| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | type listNode struct {	key int	val int	prev *listNode	next *listNode}type linkedList struct {	head *listNode	tail *listNode}func newLinkedList() *linkedList {	head, tail := &listNode{}, &listNode{}	head.next = tail	tail.prev = head	li := &linkedList{head, tail}	return li}func (li *linkedList) remove(node *listNode) {	node.prev.next = node.next	node.next.prev = node.prev}func (li *linkedList) insert(node *listNode) {	node.next = li.head.next	node.prev = li.head	li.head.next = node	node.next.prev = node}type LRUCache struct {	capacity int	size     int	cache    map[int]*listNode	list     *linkedList}func Constructor(capacity int) LRUCache {	var lru LRUCache	lru.capacity = capacity	lru.cache = make(map[int]*listNode)	lru.list = newLinkedList()	return lru}func (this *LRUCache) Get(key int) int {	if node, ok := this.cache[key]; ok {		this.list.remove(node)		this.list.insert(node)		return node.val	}	return -1}func (this *LRUCache) Put(key int, value int)  {	if this.capacity == 0 {		return	}	if node, ok := this.cache[key]; ok {		this.list.remove(node)		this.list.insert(node)		node.val = value		return	}	if this.size == this.capacity {		node := this.list.tail.prev		delete(this.cache, node.key)		this.list.remove(node)		this.size--	}	newNode := &listNode{key, value, nil, nil}	this.list.insert(newNode)	this.cache[key] = newNode	this.size++}/** * Your LRUCache object will be instantiated and called as such: * obj := Constructor(capacity); * param_1 := obj.Get(key); * obj.Put(key,value); */
 |