Esempio n. 1
0
        /// <summary>
        /// Create copyLL node in between of OriginalLL node and iterate two steps to set the right prev(random) path.
        /// Time O(n) Space O(1)
        /// </summary>
        /// <param name="originalLL"></param>
        /// <param name="copyLL"></param>
        public static void CloneLinkedListInConstantSpace(DoublyLinkedList originalLL, DoublyLinkedList copyLL)
        {
            DoublyLinkedListNode originalLLNode = originalLL.Head;
            DoublyLinkedListNode copyLLNode     = null;

            while (originalLLNode != null)
            {//Iterate original LL
                copyLLNode          = new DoublyLinkedListNode(originalLLNode.data * -1);
                copyLLNode.next     = originalLLNode.next;
                originalLLNode.next = copyLLNode;
                originalLLNode      = originalLLNode.next.next; // Move 2 steps ahead
            }
            //Each Copy Node is added between each original Node
            originalLLNode = originalLL.Head;
            while (originalLLNode != null)
            {//Set prev (Random) node value and seperate two lists.
                //Original next is Copy LLNode so use that to update prev of Copy LL node
                originalLLNode.next.prev = originalLLNode.prev.next;
                originalLLNode           = originalLLNode.next.next;
            }
            originalLLNode = originalLL.Head;
            //Set CopyList Head
            copyLL.Head = originalLLNode.next;
            copyLLNode  = copyLL.Head;
            while (originalLLNode != null)
            {//Seperate Original and CopyList
                originalLLNode.next = originalLLNode.next.next;
                if (copyLLNode.next != null)
                {
                    copyLLNode.next = copyLLNode.next.next;
                }
                else
                {
                    copyLLNode.next = null;
                }
                originalLLNode = originalLLNode.next;
                copyLLNode     = copyLLNode.next;
            }
        }
Esempio n. 2
0
 //Not Implemented for Doubly
 public DoublyLinkedListNode DeleteNode(DoublyLinkedListNode deleteNode)
 {
     if (head != null && head.data == deleteNode.data)
     {
         head = null;
     }
     else
     {
         DoublyLinkedListNode currentNode = head;
         while (currentNode != null)
         {
             if (currentNode.next.data == deleteNode.data)
             {
                 currentNode.next = currentNode.next.next;
                 break;
             }
             else
             {
                 currentNode = currentNode.next;
             }
         }
     }
     return(head);
 }