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);
- */
|