题解 | #设计LRU缓存结构#

设计LRU缓存结构

https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

package main

type Node struct {
	pre  *Node
	next *Node
	key  int
	val  int
}
type Solution struct {
	ma   map[int]*Node
	cap  int
	head *Node
	tail *Node
}

func Constructor(capacity int) Solution {
	solution := Solution{
		cap:  capacity,
		ma:   make(map[int]*Node, capacity),
		head: nil,
		tail: nil,
	}
	return solution
}

func (this *Solution) get(key int) int {
	node := this.ma[key]
	if node == nil {
		return -1
	}
	this.moveToHead(node)
	return node.val
}

func (this *Solution) moveToHead(node *Node) {
	this.removeNode(node)
	this.addHead(node)
}

func (this *Solution) addHead(node *Node) {
	if this.head == nil {
		this.head = node
		this.tail = node
	} else {
		node.next = this.head
		this.head.pre = node
		this.head = node
	}
}

func (this *Solution) removeNode(node *Node) {
	pre := node.pre
	next := node.next
	if pre != nil {
		pre.next = next
	}
	if next != nil {
		next.pre = pre
	}
	node.next = nil
	node.pre = nil

	if node == this.head {
		this.head = next
	}
	if node == this.tail {
		this.tail = pre
	}
}

func (this *Solution) removeTail() {
	node := this.tail
	if node != nil {
		this.removeNode(node)
		delete(this.ma, node.key)
	}

}

func (this *Solution) set(key int, value int) {
	node := &Node{
		key: key,
		val: value,
	}
	this.addHead(node)
	this.ma[key] = node
	if len(this.ma) > this.cap {
		this.removeTail()
	}

}

全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务