/// <summary> /// Use Hashtable to store the copyList object as we create while going next on originalLL. Use hashtable to restore prev(random) pointer /// Time O(n) Space O(n) /// </summary> /// <param name="linkedList"></param> /// <param name="copyList"></param> public static void CloneLinkedList(DoublyLinkedList linkedList, DoublyLinkedList copyList) { Hashtable linkedObj = new Hashtable(); DoublyLinkedListNode llNode = linkedList.Head; DoublyLinkedListNode copyPrevNode = new DoublyLinkedListNode(0); while (llNode != null) { DoublyLinkedListNode copyNode = new DoublyLinkedListNode(llNode.data); linkedObj.Add(copyNode.data, copyNode); if (copyList.Head == null) {//Add first Element copyPrevNode = copyNode; //copyPrevNode.next = copyList.AddNode(copyNode); } else {// copyPrevNode.next = copyNode; copyPrevNode = copyNode; } llNode = llNode.next; } llNode = linkedList.Head; DoublyLinkedListNode copyLlNode = copyList.Head; while (llNode != null && copyLlNode != null) { DoublyLinkedListNode copyNode = (DoublyLinkedListNode)linkedObj[llNode.prev.data]; copyLlNode.prev = copyNode; llNode = llNode.next; copyLlNode = copyLlNode.next; //copyList.AddBefore(llNode, copyNode); } }
public static void CloneLinkedListWithNextAndRandomPointerMain() { DoublyLinkedList ll = new DoublyLinkedList(); DoublyLinkedListNode node1 = new DoublyLinkedListNode(1); DoublyLinkedListNode node2 = new DoublyLinkedListNode(2); DoublyLinkedListNode node3 = new DoublyLinkedListNode(3); DoublyLinkedListNode node4 = new DoublyLinkedListNode(4); node1.next = node2; node1.prev = node3; node2.next = node3; node2.prev = node4; node3.next = node4; node3.prev = node1; node4.prev = node2; ll.AddNode(node1); ll.PrintLL(); DoublyLinkedList copyLL = new DoublyLinkedList(); CloneLinkedList(ll, copyLL); copyLL.PrintLL(); copyLL = new DoublyLinkedList(); CloneLinkedListInConstantSpace(ll, copyLL); copyLL.PrintLL(); }