/// <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; } }
public LRUCache(int capcity) { Capcity = capcity; dic = new Dictionary <K, Node <K, V> >(); doublyLinkedList = new DoublyLinkedList <K, V>(); }