public void AddAfter(CircularLinkedListNode <T> node, CircularLinkedListNode <T> newNode) { newNode.Next = node.Next; newNode.Previous = node; node.Next.Previous = newNode; node.Next = newNode; }
/// <inheritdoc /> public override string Part2() { List <int> cupValues = new List <int>(Input.Select(c => int.Parse(c.ToString()))); while (cupValues.Count < 1_000_000) { cupValues.Add(cupValues.Count + 1); } CircularLinkedList <int> cups = new CircularLinkedList <int>(cupValues); Dictionary <int, CircularLinkedListNode <int> > lookUp = new Dictionary <int, CircularLinkedListNode <int> >(); foreach (CircularLinkedListNode <int> node in cups.Nodes) { lookUp.Add(node.Value, node); } CircularLinkedListNode <int> currentNode = cups.First; for (int i = 0; i < 10_000_000; i++) { List <CircularLinkedListNode <int> > pickUp = new List <CircularLinkedListNode <int> > { currentNode.Next, currentNode.Next.Next, currentNode.Next.Next.Next, }; int destinationValue = currentNode.Value == 1 ? cups.Nodes.Count : currentNode.Value - 1; while (pickUp[0].Value == destinationValue || pickUp[1].Value == destinationValue || pickUp[2].Value == destinationValue) { destinationValue--; if (destinationValue == 0) { destinationValue = cups.Nodes.Count; } } CircularLinkedListNode <int> destination = lookUp[destinationValue]; cups.Remove(pickUp[0]); cups.Remove(pickUp[1]); cups.Remove(pickUp[2]); cups.AddAfter(destination, pickUp[0]); cups.AddAfter(pickUp[0], pickUp[1]); cups.AddAfter(pickUp[1], pickUp[2]); currentNode = currentNode.Next; } long output = (long)lookUp[1].Next.Value * lookUp[1].Next.Next.Value; return(output.ToString()); }
public CircularLinkedList(List <T> values) { CircularLinkedListNode <T> first = new CircularLinkedListNode <T>(values[0]); CircularLinkedListNode <T> last = new CircularLinkedListNode <T>(values[values.Count - 1]); first.Next = last; first.Previous = last; last.Next = first; last.Previous = first; Nodes.Add(first); Nodes.Add(last); for (int i = 1; i < values.Count - 1; i++) { CircularLinkedListNode <T> newNode = new CircularLinkedListNode <T>(values[i]); Nodes.Add(newNode); AddAfter(last.Previous, newNode); } }
public void Remove(CircularLinkedListNode <T> node) { node.Next.Previous = node.Previous; node.Previous.Next = node.Next; }