- clone each node of the list and connect the cloned just after its original
- the random pointer of the cloned node can be easily fetched by its previous node
`p->random->next`

- split the original node and its cloned collecting the
`odd and even`

nodes in a list

```
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head)
{
RandomListNode newHead(0), *p = head, *t = NULL;
while(p)
{
RandomListNode *cloned = new RandomListNode(p->label);
cloned->next = p->next;
p->next = cloned;
p = cloned->next;
}
p = head;
while(p && p->next)
{
if(p->random) p->next->random = p->random->next;
p = p->next->next;
}
p = head;
t = &newHead;
while(p && p->next)
{
t->next = p->next;
p->next = p->next->next;
t = t->next;
p = p->next;
}
t->next = NULL;
return newHead.next;
}
};
```