public void InsertAtBeginning(TData data)
        {
            var tempNode = new NodeDoubleLink <TData>(data)
            {
                NextLink = _startNode
            };

            _startNode.PreviousLink = tempNode;

            _startNode = tempNode;
        }
        public void InsertAtPosition(TData data)
        {
            if (_startNode == null)
            {
                InsertIfListIsNull(data);
                return;
            }

            Console.Write("Enter the position where you want to insert: ");
            var position = Convert.ToInt32(Console.ReadLine());

            if (position == 0)
            {
                return;
            }

            if (position == 1)
            {
                InsertAtBeginning(data);
                return;
            }

            int index;
            var currentNode = _startNode;

            for (index = 1; index < position - 1 && currentNode != null; index++)
            {
                currentNode = currentNode.NextLink;
            }

            if (currentNode == null)
            {
                Console.WriteLine($"You can insert only upto {index}th position.");
            }
            else
            {
                var newNode = new NodeDoubleLink <TData>
                {
                    Data         = data,
                    NextLink     = currentNode.NextLink,
                    PreviousLink = currentNode
                };

                if (currentNode.NextLink != null)
                {
                    currentNode.NextLink.PreviousLink = newNode;
                }

                currentNode.NextLink = newNode;
            }
        }
        public void DeleteLast()
        {
            if (_startNode?.NextLink == null)
            {
                _startNode = null;
                return;
            }

            var currentNode = _startNode;

            while (currentNode.NextLink.NextLink != null)
            {
                currentNode = currentNode.NextLink;
            }

            currentNode.NextLink = null;
        }
        public void DeleteFirst()
        {
            if (_startNode == null)
            {
                return;
            }

            if (_startNode.NextLink != null)
            {
                _startNode = _startNode.NextLink;
                _startNode.PreviousLink = null;

                return;
            }

            _startNode = null;
        }
        public void InsertAfter(TData data)
        {
            if (_startNode == null)
            {
                InsertIfListIsNull(data);
                return;
            }

            Console.Write("Enter the element after which you want to insert");
            var nodeValue = (TData)Convert.ChangeType(Console.ReadLine(), typeof(TData));

            var currentNode = _startNode;

            while (currentNode != null)
            {
                if (currentNode.Data.CompareTo(nodeValue) == 0)
                {
                    break;
                }

                currentNode = currentNode.NextLink;
            }

            if (currentNode == null)
            {
                Console.WriteLine($"Node with value {nodeValue} is not present in the list.");
            }

            else
            {
                var tempNode = new NodeDoubleLink <TData>(data)
                {
                    NextLink = currentNode.NextLink, PreviousLink = currentNode
                };
                if (currentNode.NextLink != null)
                {
                    currentNode.NextLink.PreviousLink = tempNode;
                }

                currentNode.NextLink = tempNode;
            }
        }
        public void InsertAtEnd(TData data)
        {
            if (_startNode == null)
            {
                InsertIfListIsNull(data);
                return;
            }

            var currentNode = _startNode;

            while (currentNode.NextLink != null)
            {
                currentNode = currentNode.NextLink;
            }

            var tempNode = new NodeDoubleLink <TData>(data);

            currentNode.NextLink  = tempNode;
            tempNode.PreviousLink = currentNode;
        }
        public void ReverseList()
        {
            if (_startNode?.NextLink == null)
            {
                return;
            }

            var currentNode = _startNode;
            var nextNode    = currentNode.NextLink;

            currentNode.NextLink     = null;
            currentNode.PreviousLink = nextNode;

            while (nextNode != null)
            {
                nextNode.PreviousLink = nextNode.NextLink;
                nextNode.NextLink     = currentNode;
                currentNode           = nextNode;
                nextNode = nextNode.PreviousLink;
            }

            _startNode = currentNode;
        }
 public DoubleLinkedList()
 {
     _startNode = null;
 }
        public void InsertIfListIsNull(TData data)
        {
            var tempNode = new NodeDoubleLink <TData>(data);

            _startNode = tempNode;
        }
 public NodeDoubleLink(TData data)
 {
     Data         = data;
     PreviousLink = null;
     NextLink     = null;
 }