//虚拟删除后返回 private DLinkedNode VirtualRemoveTail() { DLinkedNode res = tail.prev; VirtualRemoveNode(res); return(res); }
public void Put(int key, int value) { if (cacheDict.ContainsKey(key)) { DLinkedNode node = cacheDict[key]; node.value = value; MoveToHead(node); } else { DLinkedNode node = new DLinkedNode(key, value); //真正添加节点 cacheDict.Add(key, node); VirtualAddToHead(node); ++size; if (size > capacity) { // 如果超出容量,虚拟删除, 其实是删除双向链表的尾部节点 DLinkedNode tail = VirtualRemoveTail(); //真正删除节点 cacheDict.Remove(tail.key); --size; } } }
public LRUCache(int capacity) { this.capacity = capacity; this.size = 0; this.head = new DLinkedNode(); this.tail = new DLinkedNode(); head.next = tail; tail.prev = head; }
private void VirtualAddToHead(DLinkedNode node) { //修正自身节点的前后为头节点和次头节点。 node.prev = head; node.next = head.next; //修改原有头部节点和次头部节点的连接关系,修改为自己的参照。 head.next.prev = node; head.next = node; //if (!cacheDict.ContainsKey(node.key)) // cacheDict.Add(node.key, node); }
//虚拟删除(不返回) private void VirtualRemoveNode(DLinkedNode node) { //修改前后波节点的连接关系,删除自己的参照。 node.prev.next = node.next; node.next.prev = node.prev; }
private void MoveToHead(DLinkedNode node) { VirtualRemoveNode(node); VirtualAddToHead(node); }