复杂链表复制

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

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

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null)
            return null;
        RandomListNode res;
        RandomListNode p = pHead;
        while(p != null){           
            RandomListNode q = new RandomListNode(p.label);
            q.next = p.next;
            p.next = q;
            p = q.next;                     
        }
        p = pHead;
        while(p != null){
            RandomListNode p2 = p.next;
            if(p.random != null)            
                p2.random = p.random.next;
            p = p2.next; 
        }

        p = pHead;
        res = p.next;
        while(p != null){
            RandomListNode p2 = p.next;
            RandomListNode tmp = p2.next;
            if(tmp == null){
                p2.next = tmp;
            }else{
                 p2.next = tmp.next;
            }                            
            p.next = tmp;
            p = tmp;
        }

        return res;        
    }
}

(1)首先在每个结点后面添加一个结点
(2)对新添加的每个结点的random指针根据前面的指针的random进行复制!这里注意一定要判断if(p.random != null) 因为后面用到了p.random.next(),若这里不判断null的话,会出现空指针错误!
(3)在拆分数组的时候也得对最后的结点进行判断,因为最后会有一个null指针表示链表的结束,而新的复杂链表是没有null指针的,所以需要合理的添加一个!而且后面使用到了tmp.next ,这种指针的指针最好都要进行判断null!!!

参考:
https://blog.csdn.net/u012289407/article/details/46609731

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80149865
今日推荐