package com.interview.linklist;

import com.interview.array.Solution;

/**
 * Date 03/24/2016
 * @author Tushar Roy
 *
 * A linked list is given such that each node contains an additional random pointer which could point
 * to any node in the list or null. Return a deep copy of the list.
 *
 * Time complexity is O(n)
 * Space complexity is O(1)
 *
 * https://leetcode.com/problems/copy-list-with-random-pointer/
 */
public class CopyLinkListWIthArbitPointer {

    static class RandomListNode {
        int label;
        RandomListNode next, random;
        RandomListNode(int x) { this.label = x; }
    }

    public RandomListNode copyRandomList(RandomListNode head) {
        if (head == null) {
            return null;
        }

        RandomListNode current = head;
        while (current != null) {
            RandomListNode newNode = new RandomListNode(current.label);
            newNode.next = current.next;
            newNode.random = current.random;
            current.next = newNode;
            current = newNode.next;
        }

        current = head;
        while (current != null) {
            RandomListNode next = current.next;
            if (next.random != null) {
                next.random = next.random.next;
            }
            current = current.next.next;
        }

        current = head;
        RandomListNode dummy = new RandomListNode(0);
        RandomListNode newCurrent = dummy;
        while (current != null) {
            newCurrent.next = current.next;
            newCurrent = newCurrent.next;
            current.next = current.next.next;
            current = current.next;
        }

        return dummy.next;
    }

    public static void main(String args[]){

        CopyLinkListWIthArbitPointer cll = new CopyLinkListWIthArbitPointer();

        RandomListNode randomListNode = new RandomListNode(-1);
        RandomListNode randomListNode1 = new RandomListNode(4);
        RandomListNode randomListNode2 = new RandomListNode(8);
        RandomListNode randomListNode3 = new RandomListNode(-3);
        RandomListNode randomListNode4 = new RandomListNode(7);
        randomListNode.next = randomListNode1;
        randomListNode1.next = randomListNode2;
        randomListNode2.next = randomListNode3;
        randomListNode3.next = randomListNode4;

        randomListNode.random = randomListNode1;
        randomListNode2.random = randomListNode3;
        randomListNode1.random = randomListNode;
        cll.copyRandomList(randomListNode);
    }
}

@@ -30,46 +30,8 @@
 t;%0A%0A
-import com.interview.array.Solution;%0A%0A
 /**%0A

remove import