给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点
要求返回这个节点的深拷贝。
摘要:
public class Test27 {
public static void main(String[] agrs) {
CNode head=null;
CNode n1=new CNode(1);
CNode n2=new CNode(2);
CNode n3=new CNode(3);
CNode n4=new CNode(4);
n1.next=n2;
n2.next=n3;
n3.next=n4;
n1.random=n3;
n2.random=n1;
n3.random=n3;
head=n1;
CNode newHead= deepCopy(head);
Print(newHead);
}
private static void Print(CNode newHead){
for(CNode cur=newHead;cur!=null;cur=cur.next)
{
System.out.print(cur);
}
System.out.println("null");
for(CNode cur=newHead;cur!=null;cur=cur.next)
{
System.out.print(cur.random);
}
}
private static CNode deepCopy(CNode head){
if(head==null)
{
return null;
}
CNode p1=head;
while(p1!=null)
{
CNode p2=new CNode(p1.val);
p2.next=p1.next;
p1.next=p2;
p1=p2.next;
}
p1=head;
while(p1!=null)
{
CNode p2=p1.next;
if(p1.random!=null)
{
p2.random=p1.random.next;
}
p1=p2.next;
}
p1=head;
CNode newHead=head.next;
while(p1!=null)
{
CNode p2=p1.next;
p1.next=p2.next;
if(p2.next!=null)
{
p2.next=p2.next.next;
}
p1=p1.next;
}
return newHead;
}
}
class CNode{
int val=0;
CNode next=null;
CNode random=null;
public CNode(int val){
this.val=val;
this.next=null;
this.random=null;
}
public String toString(){
return String.format("CNode(%d)-->",val);
}
}