题解 | #设计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()
	}

}

全部评论

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务