题解 | #设计LRU缓存结构#
设计LRU缓存结构
https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84
package main // 手动实现LRU&时间复杂度为1. // 双端有序列表 + hashMap. // get & set -> 时间复杂度为1; -> HashMap // set的时候需要弹出最不常用的元素; -> 根据元素的顺序排列 // 每次get;set都用把元素放到最高优先级;放到队列末尾 //调试代码难;做好把拆分方法的;尽量复用性高 type dataNode struct { Key int Val int pre *dataNode next *dataNode } type Solution struct { // write code here HashStorage map[int]*dataNode //节点值指向具体的节点 Cap int //容量 Head *dataNode //双端列表的头 Tail *dataNode //双端列表的尾 } func Constructor(capacity int) Solution { // write code here return Solution{ HashStorage: make(map[int]*dataNode), Cap: capacity, Head: nil, Tail: nil, } } func (this *Solution) get(key int) int { // write code here node, ok := this.HashStorage[key] if !ok { return -1 } //添加到队列的末尾 this.moveNodeToTheEnd(node) return node.Val } func (this *Solution) moveNodeToTheEnd(node *dataNode) { if this.Tail == node { return } //前后节点建立链接;保证有效 //从原先的位置删除 this.deleteFromList(node) //放到后面 this.addNodeToEnd(node) } func (this *Solution) deleteFromList(node *dataNode) { //唯一元素 if this.Head == node && this.Tail == node { this.Head = nil this.Tail = nil return } //队尾? if this.Tail == node { if this.Tail.pre != nil { this.Tail.pre.next = nil } this.Tail = this.Tail.pre return } //队首 if this.Head == node { if this.Head.next != nil { this.Head.next.pre = nil } this.Head = this.Head.next return } //队中 node.pre.next, node.next.pre = node.next, node.pre } // 队尾添加元素 func (this *Solution) addNodeToEnd(node *dataNode) { if this.Head == nil && this.Tail == nil { this.Head = node this.Tail = node return } //加到队尾 this.Tail.next = node node.pre = this.Tail node.next = nil this.Tail = node //节点变成最后一个节点 } func (this *Solution) set(key int, value int) { // write code here //新增或者修改? node, ok := this.HashStorage[key] if ok { //修改 node.Val = value this.moveNodeToTheEnd(node) return } //插入的情况; if len(this.HashStorage) >= this.Cap { //弹出首个元素 tmpV := this.Head.Key this.deleteFromList(this.Head) delete(this.HashStorage, tmpV) } //加入一个元素 node = &dataNode{ Key: key, Val: value, } this.HashStorage[key] = node this.addNodeToEnd(node) return }