| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | package main// BiListNode ...type BiListNode struct {	Key  int	Val  int	Prev *BiListNode	Next *BiListNode}// LRUCache ...type LRUCache struct {	Cap   int	Size  int	Head  *BiListNode	Tail  *BiListNode	Cache map[int]*BiListNode}// Constructor ...func Constructor(capacity int) (cache LRUCache) {	cache.Cap, cache.Size = capacity, 0	cache.Cache = make(map[int]*BiListNode)	return}// Get ...func (cache *LRUCache) Get(key int) int {	if node, ok := cache.Cache[key]; ok {		if node != cache.Head {			if node == cache.Tail {				cache.Tail = cache.Tail.Prev			}			// Delete node			if node.Next != nil {				node.Next.Prev = node.Prev			}			node.Prev.Next = node.Next			// node is the new Head			node.Prev = nil			node.Next = cache.Head			cache.Head.Prev = node			cache.Head = node			// Update Tail			if cache.Tail == nil {				cache.Tail = cache.Head			}		}		return node.Val	}	return -1}// Put ...func (cache *LRUCache) Put(key int, value int) {	if node, ok := cache.Cache[key]; ok {		if node != cache.Head {			if node == cache.Tail {				cache.Tail = cache.Tail.Prev			}			// Delete node			if node.Next != nil {				node.Next.Prev = node.Prev			}			node.Prev.Next = node.Next			// node is the new Head			node.Prev = nil			node.Next = cache.Head			cache.Head.Prev = node			cache.Head = node			// Update Tail			if cache.Tail == nil {				cache.Tail = cache.Head			}		}		cache.Head.Val = value	} else {		node := &BiListNode{key, value, nil, cache.Head}		if cache.Size == 0 {			cache.Tail = node		} else {			cache.Head.Prev = node		}		cache.Head = node		cache.Size++		if cache.Size > cache.Cap {			delete(cache.Cache, cache.Tail.Key)			cache.Tail = cache.Tail.Prev			cache.Tail.Next = nil			cache.Size--		}		cache.Cache[key] = cache.Head	}}/** * Your LRUCache object will be instantiated and called as such: * obj := Constructor(capacity); * param_1 := obj.Get(key); * obj.Put(key,value); */// func main() {// 	cache := Constructor(2 /* capacity */)// 	cache.Put(1, 1)// 	cache.Put(2, 2)// 	println(cache.Get(1)) // returns 1// 	cache.Put(3, 3)       // evicts key 2// 	println(cache.Get(2)) // returns -1 (not found)// 	cache.Put(4, 4)       // evicts key 1// 	println(cache.Get(1)) // returns -1 (not found)// 	println(cache.Get(3)) // returns 3// 	println(cache.Get(4)) // returns 4// }
 |