分析:在本题中我们将问题分开来求解,首先先将要复制的链表按照原链表的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;
}
}