Example #1
0
        public static void DoubleLinkedListFunctions()
        {
            DLinkedList list = new DLinkedList();

            list.head = new DLinkedList.Node(2);
            list.InsertAtFront(0);

            list.InsertAfterNode(list.head, 1);

            list.InsertAtEnd(3);

            //DLinkedList.Node delNode = list.head.getNext().getNext();
            //list.DeleteNode(delNode);

            list.ReverseList(); //O(N) complexity
        }
        public void InsertAfterNode(Node prevNode, int data)
        {
            DLinkedList list = this;
            Node        node = new Node(data);

            //Get Next Node
            Node nextNode = prevNode.getNext();

            //New Node Next and Prev
            node.setNext(nextNode);
            node.setPrev(prevNode);

            //Next Node's prev and Prev Node's next
            nextNode.setPrev(node);
            prevNode.setNext(node);
        }
        public void InsertAtFront(int data)
        {
            DLinkedList list = this;
            Node        node = new Node(data);

            //Set New Node's prev to null and Next to head
            node.setPrev(null);
            node.setNext(head);

            //If Head is not null, set head's prev to new node
            if (list.head != null)
            {
                head.setPrev(node);
            }

            head = node;
        }
        public void InsertAtEnd(int data)
        {
            DLinkedList list = this;
            Node        node = new Node(data);

            Node current = list.head;

            while (current != null && current.getNext() != null)
            {
                current = current.getNext();
            }

            //Loop will end when it find current.next = null which will be the last node.

            current.setNext(node);

            node.setPrev(current);
            node.setNext(null);
        }
        public void ReverseList()
        {
            DLinkedList list = this;
            Node        temp = null, current;

            current = list.head;

            while (current != null)
            {
                temp = current.getPrev();
                current.setPrev(current.getNext());
                current.setNext(temp);
                current = current.getPrev();
            }

            if (temp != null)
            {
                head = temp.getPrev();
            }
        }
        public void DeleteNode(Node delNode)
        {
            DLinkedList list = this;

            if (list.head == null || delNode == null)
            {
                return;
            }

            if (list.head == delNode)
            {
                list.head = delNode.getNext();
            }

            if (delNode != null)
            {
                Node prevNode = delNode.getPrev();
                Node nextNode = delNode.getNext();

                prevNode.setNext(nextNode);
                nextNode.setPrev(prevNode);
            }
        }