コード例 #1
0
        public void AddAfter(CircularLinkedListNode <T> node, CircularLinkedListNode <T> newNode)
        {
            newNode.Next     = node.Next;
            newNode.Previous = node;

            node.Next.Previous = newNode;
            node.Next          = newNode;
        }
コード例 #2
0
ファイル: Day23.cs プロジェクト: w200338/Advent-Of-Code-2020
        /// <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());
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
 public void Remove(CircularLinkedListNode <T> node)
 {
     node.Next.Previous = node.Previous;
     node.Previous.Next = node.Next;
 }