private DLinkedDicNode PopTail() { DLinkedDicNode result = Tail.Previous; RemoveNode(result); return(result); }
public LeetCode146(int capacity) { Capacity = capacity; Size = 0; Head = new DLinkedDicNode(0, 0); Tail = new DLinkedDicNode(0, 0); // initialed an double linked list Head.Post = Tail; Tail.Previous = Head; }
private void AddNode(DLinkedDicNode node) { // The following process is add the node in between Head node and second node // 1 <-> 5 now we want add 3 // 1 <- 3 node.Previous = Head; // 1 <- 3 -> 5 node.Post = Head.Post; // 1 <- 3 <->5 Head.Post.Previous = node; // 1 <-> 3 <-> 5 Head.Post = node; }
private void RemoveNode(DLinkedDicNode node) { // the following logic should be to remove a node in double list // 1 <-> 3 <-> 5, we want remove 3 // temp1 temp2 temp1 holds previous element, temp2 holds post value DLinkedDicNode temp1 = node.Previous; DLinkedDicNode temp2 = node.Post; // 1<- 3 <-> 5 // 1 ->5 temp1.Post = temp2; // 1 <-> 5 temp2.Previous = temp1; }
public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("Hot["); while (Head != null) { sb.Append($"{Head.Value},"); Head = Head.Post; } sb.Append("]Cold"); return(sb.ToString()); }
public void Put(int key, int value) { if (!cache.ContainsKey(key)) { var newNode = new DLinkedDicNode(key, value); AddNode(newNode); cache.Add(key, newNode); Size++; if (Size > Capacity) { var temp = PopTail(); cache.Remove(temp.Key); Size--; } } else { cache[key].Value = value; MoveToHead(cache[key]); } }
private void MoveToHead(DLinkedDicNode node) { RemoveNode(node); AddNode(node); }