您的位置:首页 > 其它

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

2017-11-18 23:44 1081 查看
分析:在本题中我们将问题分开来求解,首先先将要复制的链表按照原链表的next的关系拼接成新的链表,然后再去处理random(根据原链表中的每一个节点random节点所在的步长)来进行拼接。

/*

public class RandomListNode {

    int label;

    RandomListNode next = null;

    RandomListNode random = null;

    RandomListNode(int label) {

        this.label = label;

    }

}

*/

public class Solution {

    boolean flag=true;

    RandomListNode newHead;//保存首节点

    RandomListNode newPHead;//保存首节点

     //定义准备复原的节点

    RandomListNode new_PHead;

    RandomListNode new_Head;

    public RandomListNode Clone(RandomListNode pHead)

    { 

        RandomListNode cHead=new RandomListNode(0);

        if(pHead ==null){

            return null;

        }else if(pHead.next==null){

            //只有一个节点

            cHead.label=pHead.label;

            return cHead;

        }

          cHead.label=pHead.label;

        while(pHead.next !=null){

            //首先拼接节点中的next指针

            RandomListNode node=new RandomListNode(0);//创建新的节点

            node.label=pHead.next.label;

            cHead.next=node;

            if(flag){

                newHead=cHead;

                newPHead=pHead;

                flag=false;

                

            }

            cHead=node;

            pHead=pHead.next;

        }

            //头结点复原

            pHead=newPHead;

            cHead=newHead;

            new_PHead=newPHead;

            new_Head=newHead;

            //拼接节点中的random指针

            while(newPHead !=null){

                int index=0;

               if(newPHead.random !=null){

                   //统计步长

                   RandomListNode node_random=newPHead.random;

                   while(pHead !=node_random){

                       index++;

                       pHead=pHead.next;

                   }

                   for(int i=0;i<index;i++){

                       newHead=newHead.next;

                   }

                   cHead.random=newHead;

                   //复原头结点

                   newHead=new_Head;

                   pHead=new_PHead;

               } 

                newPHead=newPHead.next;

                cHead=cHead.next;

        }

        return new_Head;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐