146. LRU Cache ( Least Recently Used)

import kotlin.collections.HashMap

/**
 * 146. LRU Cache
 * https://leetcode.com/problems/lru-cache/description/
 *
 * 我们需要设计:
 * 1:使用HashMap:用于存储现有的key,value就是指向双向链表的节点
 * 2:双向链表:在移除尾部元素、添加元素到头部、移动元素到头部都可以在O(1)完成
*
*/ class Node(key: Int, value: Int) { var key = 0 var value = 0 var next: Node? = null var prev: Node? = null init { this.key = key this.value = value } } class LRUCache(capacity: Int) { var head: Node? = null var tail: Node? = null var capacity = 0 val map = HashMap<Int, Node>(capacity) init { this.capacity = capacity } fun get(key: Int): Int { val n = map.get(key) if (n == null) { return -1 } removeNode(n) //add node to tail addNode(n) return n.value } fun put(key: Int, value: Int) { if (map.containsKey(key)) { val node = map.get(key) node?.value = value removeNode(node!!) addNode(node) } else { if (map.size >= capacity) { if (head != null) { map.remove(head?.key) removeNode(head!!) } } val newNode = Node(key, value) addNode(newNode) map.put(key, newNode) } } private fun removeNode(node: Node) { if (node.prev != null) { node.prev?.next = node.next } else { head = node.next } if (node.next != null) { node.next?.prev = node.prev } else { tail = node.prev } } private fun addNode(node: Node) { if (tail != null) { tail?.next = node } node.prev = tail node.next = null tail = node if (head == null) { head = tail } } } /** * Your LRUCache object will be instantiated and called as such: * var obj = LRUCache(capacity) * var param_1 = obj.get(key) * obj.put(key,value) */

猜你喜欢

转载自www.cnblogs.com/johnnyzhao/p/12383568.html