遍历原有的链表的每个节点的同时,复制节点的random和next。不需要用到其它的什么容器来存储,因此时间复杂度较低,超过百分之九十。

public class SolutionJZ25 {
    public RandomListNode Clone(RandomListNode pHead) {
        //为空就返回
        if(pHead==null) return null;
        //下面10行为复制第一个节点。并且用一个res来指向第一个节点,用来作为返回的头结点
        RandomListNode newNode = new RandomListNode(pHead.label);
        if (pHead.random != null) {
            newNode.random = new RandomListNode(pHead.random.label);
        }
        if (pHead.next != null) {
            newNode.next=new RandomListNode(pHead.next.label);
        }
        RandomListNode res=newNode;
        newNode=newNode.next;
        pHead = pHead.next;

        //下面的循环为:如果pHead节点不为空,就复制它的random和next。然后pHead指针和newNode指针下移到各自的next。直到走到链表的结尾
        while (pHead != null) {
            if (pHead.random != null) {
                newNode.random = new RandomListNode(pHead.random.label);
            }
            if (pHead.next != null) {
                newNode.next=new RandomListNode(pHead.next.label);
            }
            newNode=newNode.next;
            pHead = pHead.next;
        }
        return res;
    }
}