using System; using System.Collections.Generic; public class Solution { Dictionary<int, Node> cache = new Dictionary<int, Node>(); Node head = new Node(-1,-1); Node tail = new Node(-1,-1); int Capacity{get;} int Count => cache.Count; public class Node{ public int key; public int value; public Node pre; public Node next; public Node(){} public Node(int key, int value){ this.key = key; this.value = value; } } public Solution(int capacity) { Capacity = capacity; head.next = tail; tail.pre = head; } public int get(int key) { if(cache.TryGetValue(key, out Node node)){ SetFirst(node); return node.value; } else return -1; } public void set(int key, int value) { if(cache.TryGetValue(key, out Node node)){ SetFirst(node); node.value = value; return; } if(Count == Capacity){ RemoveLast(); } Add(key, value); } public void Remove(Node node){ node.pre.next = node.next; node.next.pre = node.pre; node.pre = null; node.next = null; } public void SetFirst(Node node){ node.pre.next = node.next; node.next.pre = node.pre; head.next.pre = node; node.pre = head; node.next = head.next; head.next = node; } public void Add(int key, int value){ Node node = new Node(key, value); cache.Add(key, node); head.next.pre = node; node.pre = head; node.next = head.next; head.next = node; Console.WriteLine("add(key):" + key); } public void RemoveLast(){ Node node = tail.pre; if(node != head){ Console.WriteLine("remove(key):" + node.key); cache.Remove(node.key); Remove(node); return; } Console.WriteLine("cant remove the last : the count == 0!"); } } /** * Your Solution object will be instantiated and called as such: * Solution solution = new Solution(capacity); * int output = solution.get(key); * solution.set(key,value); */