public static DoublyLinkedListNode <int> InsertAtTail(DoublyLinkedListNode <int> head, int data)
        {
            DoublyLinkedListNode <int> newNode = new DoublyLinkedListNode <int>(data);

            if (head == null)
            {
                head = newNode;
                return(head);
            }

            DoublyLinkedListNode <int> lastNode = head;

            while (lastNode.Next != null)
            {
                lastNode = lastNode.Next;
            }

            newNode.Prev  = lastNode;
            lastNode.Next = newNode;

            return(head);
        }
        public static DoublyLinkedListNode <int> Reverse(DoublyLinkedListNode <int> head)
        {
            if (head == null)
            {
                return(head);
            }

            DoublyLinkedListNode <int> current = head;
            DoublyLinkedListNode <int> newHead = head;

            while (current != null)
            {
                DoublyLinkedListNode <int> prev = current.Prev;

                current.Prev = current.Next;
                current.Next = prev;

                newHead = current;
                current = current.Prev; // Item in the next in iteration has been the prev of current.
            }

            return(newHead);
        }
        public static DoublyLinkedListNode <int> InsertSorted(DoublyLinkedListNode <int> head, int data)
        {
            DoublyLinkedListNode <int> newNode = new DoublyLinkedListNode <int>(data);

            if (head == null)
            {
                return(newNode);
            }

            if (data <= head.Data)
            {
                newNode.Next = head;
                head.Prev    = newNode;
                return(newNode);
            }

            DoublyLinkedListNode <int> currentNode = head;

            while (currentNode.Next != null && data > currentNode.Next.Data)
            {
                currentNode = currentNode.Next;
            }

            DoublyLinkedListNode <int> nextOfCurrent = currentNode.Next;

            newNode.Next = nextOfCurrent;

            if (nextOfCurrent != null)
            {
                nextOfCurrent.Prev = newNode;
            }

            newNode.Prev     = currentNode;
            currentNode.Next = newNode;

            return(head);
        }