复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

O(n2)算法:

  第一步是复制原始链表上的每一个结点,并用Next节点链接起来;

  第二步是设置每个结点的Sibling节点指针。

O(n)辅助空间

第一步复制原始链表上的每个结点N创建N',然后把这些创建出来的结点用Next链接起来。同时我们把<N,N'>的配对信息放到一个哈希表中。

第二步还是设置复制链表上每个结点的m_pSibling。由于有了哈希表,我们可以用O(1)的时间根据S找到S'。

O(n)不借助辅助空间

1、根据原始链表的每个结点N创建对应的N'

 

2、设置复制出来的结点的Sibling。(把N'的Sibling指向N的Sibling)

 

 3、把这个长链表拆分成两个链表:把奇数位置的结点用Next链接起来就是原始链表,偶数数值的则是复制链表

 

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    
    public void buildOfList(RandomListNode pHead){
        
        RandomListNode p=pHead;
        while(p!=null){
            RandomListNode temp=new RandomListNode(p.label);
            temp.next=p.next;
            temp.random=null;
            p.next=temp;
            p=temp.next;
        }
    }
    
    public void buildRandomList(RandomListNode pHead){
        RandomListNode p=pHead;
        RandomListNode q;
        while(p!=null){
            q=p.next;
            if(p.random!=null){
                q.random=p.random.next;
            }
            p=q.next;
        }
    }
    
    public void cloneList(RandomListNode pHead,RandomListNode cloneHead){
        RandomListNode p=pHead;
        RandomListNode q=cloneHead;
        
        while(p!=null && q!=null){
           q.next=p.next;
           q=p.next;
           p.next=q.next;
           p=q.next;
        }
    }
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead==null) return null;
        RandomListNode cloneHead=new RandomListNode(0);
        
        buildOfList(pHead);
        buildRandomList(pHead);
        cloneList(pHead,cloneHead);
        return cloneHead.next;
    }
}
posted on 2018-08-05 22:40  溪水静幽  阅读(107)  评论(0)    收藏  举报