public void AddCache(int key, int val) { CacheNode node = new CacheNode(key, val); node.Next = head.Next; node.Prev = head; head.Next = node; if (node.Next != null) node.Next.Prev = node; if (tail == head) { tail = head.Next; } map.Add(key, node); if (map.Count > maxCacheSize) { map.Remove(tail.Key); tail = tail.Prev; tail.Next = null; } }
public LRUCache(int size) { tail = head; maxCacheSize = size; }
public CacheNode() { Value = Key = 0; Next = Prev = null; }
public CacheNode(int key, int val) { Next = Prev = null; Value = val; Key = key; }
public CacheNode GetCache(int key) { if (map.ContainsKey(key)) { CacheNode node = map[key]; // If node is already the first one in the list, nothing need to be done if (node != head.Next) { if (tail == node) { tail = node.Prev; tail.Next = null; } else { node.Prev.Next = node.Next; node.Next.Prev = node.Prev; } head.Next.Prev = node; node.Next = head.Next; node.Prev = head; head.Next = node; } return node; } return null; }