146.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package main
  2. // BiListNode ...
  3. type BiListNode struct {
  4. Key int
  5. Val int
  6. Prev *BiListNode
  7. Next *BiListNode
  8. }
  9. // LRUCache ...
  10. type LRUCache struct {
  11. Cap int
  12. Size int
  13. Head *BiListNode
  14. Tail *BiListNode
  15. Cache map[int]*BiListNode
  16. }
  17. // Constructor ...
  18. func Constructor(capacity int) (cache LRUCache) {
  19. cache.Cap, cache.Size = capacity, 0
  20. cache.Cache = make(map[int]*BiListNode)
  21. return
  22. }
  23. // Get ...
  24. func (cache *LRUCache) Get(key int) int {
  25. if node, ok := cache.Cache[key]; ok {
  26. if node != cache.Head {
  27. if node == cache.Tail {
  28. cache.Tail = cache.Tail.Prev
  29. }
  30. // Delete node
  31. if node.Next != nil {
  32. node.Next.Prev = node.Prev
  33. }
  34. node.Prev.Next = node.Next
  35. // node is the new Head
  36. node.Prev = nil
  37. node.Next = cache.Head
  38. cache.Head.Prev = node
  39. cache.Head = node
  40. // Update Tail
  41. if cache.Tail == nil {
  42. cache.Tail = cache.Head
  43. }
  44. }
  45. return node.Val
  46. }
  47. return -1
  48. }
  49. // Put ...
  50. func (cache *LRUCache) Put(key int, value int) {
  51. if node, ok := cache.Cache[key]; ok {
  52. if node != cache.Head {
  53. if node == cache.Tail {
  54. cache.Tail = cache.Tail.Prev
  55. }
  56. // Delete node
  57. if node.Next != nil {
  58. node.Next.Prev = node.Prev
  59. }
  60. node.Prev.Next = node.Next
  61. // node is the new Head
  62. node.Prev = nil
  63. node.Next = cache.Head
  64. cache.Head.Prev = node
  65. cache.Head = node
  66. // Update Tail
  67. if cache.Tail == nil {
  68. cache.Tail = cache.Head
  69. }
  70. }
  71. cache.Head.Val = value
  72. } else {
  73. node := &BiListNode{key, value, nil, cache.Head}
  74. if cache.Size == 0 {
  75. cache.Tail = node
  76. } else {
  77. cache.Head.Prev = node
  78. }
  79. cache.Head = node
  80. cache.Size++
  81. if cache.Size > cache.Cap {
  82. delete(cache.Cache, cache.Tail.Key)
  83. cache.Tail = cache.Tail.Prev
  84. cache.Tail.Next = nil
  85. cache.Size--
  86. }
  87. cache.Cache[key] = cache.Head
  88. }
  89. }
  90. /**
  91. * Your LRUCache object will be instantiated and called as such:
  92. * obj := Constructor(capacity);
  93. * param_1 := obj.Get(key);
  94. * obj.Put(key,value);
  95. */
  96. // func main() {
  97. // cache := Constructor(2 /* capacity */)
  98. // cache.Put(1, 1)
  99. // cache.Put(2, 2)
  100. // println(cache.Get(1)) // returns 1
  101. // cache.Put(3, 3) // evicts key 2
  102. // println(cache.Get(2)) // returns -1 (not found)
  103. // cache.Put(4, 4) // evicts key 1
  104. // println(cache.Get(1)) // returns -1 (not found)
  105. // println(cache.Get(3)) // returns 3
  106. // println(cache.Get(4)) // returns 4
  107. // }