/// <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; } }
//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); }