牛客(25)复杂链表的复制

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

        RandomListNode(int label) {
            this.label = label;
        }
    }

    //  不会看的别人的思路
    public static RandomListNode Clone(RandomListNode pHead) {
        //保存头节点
        RandomListNode newLink = pHead;
        //复制节点并插入节点
        while (newLink != null) {
            //复制节点
            RandomListNode insert = new RandomListNode(newLink.label);
            //插入被复制的节点后面
            insert.next = newLink.next;
            newLink.next = insert;
            //指针移动到下一个要复制的节点
            newLink = insert.next;
        }
        //修改random
        newLink =pHead;
        while (newLink != null) {
            if (newLink.random != null) {
                newLink.next.random = newLink.random.next;
            }
            newLink = newLink.next.next;
        }


//      拆分
        RandomListNode clone =  new RandomListNode(0);
        RandomListNode result=clone;
        newLink =pHead;
        while (newLink != null) {
            clone.next=newLink.next;
            clone=clone.next;
            newLink.next = newLink.next.next;
            newLink=newLink.next;
//            newLink=newLink.next.next;直接返回空
        }

        return result.next;
     }

 

posted @ 2018-05-11 12:42  楷兵  阅读(114)  评论(0编辑  收藏  举报