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
- // }
|