type LRUCache struct {
size, capacity int
head, tail *DLinkedNode
cache map[int]*DLinkedNode
}
type DLinkedNode struct {
key, value int
pre, next *DLinkedNode
}
func InitDLinkedNode(key, value int) *DLinkedNode {
return &DLinkedNode{
key:key,
value:value,
}
}
func (this *LRUCache) AddToHead(node *DLinkedNode) {
node.next = this.head.next
node.pre = this.head
this.head.next.pre = node
this.head.next = node
}
func (this *LRUCache) RemoveNode(node *DLinkedNode) {
node.next.pre = node.pre
node.pre.next = node.next
}
func (this *LRUCache) MoveToHead(node *DLinkedNode) {
this.RemoveNode(node)
this.AddToHead(node)
}
func (this *LRUCache) RemoveTail() *DLinkedNode {
node := this.tail.pre
this.RemoveNode(node)
return node
}
func Constructor(capacity int) LRUCache {
l:= LRUCache {
capacity:capacity,
head: InitDLinkedNode(0, 0),
tail:InitDLinkedNode(0, 0),
cache: map[int]*DLinkedNode{},
}
l.head.next = l.tail
l.tail.pre = l.head
return l
}
func (this *LRUCache) Get(key int) int {
if _, ok := this.cache[key]; !ok {
return -1
}
node := this.cache[key]
this.MoveToHead(node)
return node.value
}
func (this *LRUCache) Put(key int, value int) {
if _, ok := this.cache[key]; !ok {
node := InitDLinkedNode(key, value)
this.AddToHead(node)
this.cache[key] = node
this.size++
if this.size > this.capacity {
tailNode := this.RemoveTail()
delete(this.cache, tailNode.key)
this.size--
}
} else {
node := this.cache[key]
node.value = value
this.MoveToHead(node)
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* obj := Constructor(capacity);
* param_1 := obj.Get(key);
* obj.Put(key,value);
*/
对应leetcode官网链接
leetcode题目链接