import java.util.concurrent.ConcurrentHashMap
class LRUCache constructor(private val capacity: Int) {
class DLinkedNode {
var key: String? = null
var value: Int = 0
var pre: DLinkedNode? = null
var post: DLinkedNode? = null
}
private val head = DLinkedNode()
private val tail = DLinkedNode()
private val map = ConcurrentHashMap<String, DLinkedNode>()
private var count = 0
init {
head.pre = null
head.post = tail
tail.pre = head
tail.post = null
}
fun get(key: String): Int {
val node = map[key] ?: return -1
moveToHead(node)
return node.value
}
fun put(key: String, value: Int) {
val node = map[key]
if(node != null){
node.value = value
moveToHead(node)
return
}
val newNode = DLinkedNode()
newNode.key = key
newNode.value = value
addNode(newNode)
if(++count > capacity){
map.remove(tail.pre!!.key)
removeNode(tail.pre!!)
count--
}
}
private fun moveToHead(node: DLinkedNode) {
removeNode(node)
addNode(node)
}
private fun addNode(node: DLinkedNode) {
head.post!!.pre = node
node.post = head.post
head.post = node
node.pre = head
}
private fun removeNode(node: DLinkedNode) {
val pre = node.pre
val post = node.post
pre!!.post = post
post!!.pre = pre
}
}
HashMap+双向链表实现LRU (Kotlin实现)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 转自:https://zhuanlan.zhihu.com/p/34133067?utm_source=weibo...
- 无论是应届生的春招、秋招还是社招,难以避免的一关都是要面对面试官来几个手撕算法,如果你参加过几次面试,就知道链表出...