这道题有两种思路。第一种普通思路:先顺序复制并且设置好next指针,让新节点的random指向老链表中对应的节点,并且开一个map,一边复制一边存下新旧对应节点地址映射。第二遍遍历根据map把新节点中的random指针都调整正确。这个map消耗了额外空间。
第二种思路:省去这个map,要求是仍然从老节点能直接找到对应的新节点,则方法为把新节点全都缀连在老节点之后。等设置好所有的random之后再拆分两个链表。代码如下。
注意最后新老链表都要还原否则不通过。
图片说明

public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if (pHead==null) return null;
        RandomListNode i=pHead, newNode=null;
        while(i!=null)
        {
            newNode = new RandomListNode(i.label);
            newNode.next= i.next;
            i.next = newNode;
            i=i.next.next;
        }
        i=pHead;
        while(i!=null)
        {
            newNode=i.next;
            if (i.random == null) newNode.random=null;
            else
            newNode.random=i.random.next;
            i=newNode.next;
        }
        i=pHead;
        newNode=pHead.next;
        RandomListNode res = pHead.next;
        while(i!=null)
        {
           newNode=i.next;
           i.next=newNode.next;
           if (newNode.next!=null)
               newNode.next=newNode.next.next;
           i=i.next;
        }
        return res;
    }
}