public static RandomListNode solution(RandomListNode head){
		
		if(head==null)
			return null;
		
		//first method copy with two iteration
		//first iteration copy the regular add hash map to store all the point object
		HashMap<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
		RandomListNode dummy = new RandomListNode(0);
		RandomListNode current = head;
		RandomListNode pre = dummy;
		
		while(head!=null){
			//build up current item
			if(map.containsKey(head)){
				current = map.get(head);
			}else{
				current = new RandomListNode(head.label);
			}
			
			//test for first item
			if(dummy.next==null){
				dummy.next = current;
			}else{
				pre.next = current;
			}
			
			//handle random pointer
			if(head.random!=null){
				if(map.containsKey(head.random)){
					current.random = map.get(head.random);
				}else{
					RandomListNode newNode = new RandomListNode(head.random.label);
					map.put(head.random, newNode);
					current.random = newNode;
				}
			}
			
			pre = current;
			head = head.next;
		}
		
		
		return dummy.next;
		
	}