题目:
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
思路:
public class Copy_List_with_Random_Pointer {
public static nodeIndex deepCopy(nodeIndex nodeHead){
nodeIndex copyIndex = nodeHead;
while (nodeHead.next!=null) {
nodeHead.next=nodeHead.copyNodeIndex();
nodeHead = nodeHead.next.next;
}
return copyIndex;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
nodeIndex node1 = new nodeIndex();
node1.lable = "1";
nodeIndex node2 = new nodeIndex();
node2.lable = "2";
nodeIndex node3 = new nodeIndex();
node3.lable = "3";
nodeIndex node4 = new nodeIndex();
node4.lable = "4";
nodeIndex node5 = new nodeIndex();
node5.lable = "0";
node1.next=node2;
node1.rando=node3;
node2.next=node3;
node2.rando=node4;
node3.next=node4;
node3.rando=node2;
node4.next=node5;
node4.rando=node2;
node5.rando=null;
nodeIndex nn1 = deepCopy(node1);
nodeIndex nn2 = nn1;
nodeIndex nn3 = nn1;
nodeIndex nn4 = nn1;
nodeIndex nn5 = nn1.next;
System.out.print("lable: ");
while(nn1.next!=null){
System.out.print(nn1.lable);
nn1=nn1.next;
}
System.out.println("");
System.out.print("rando: ");
while(nn2.next!=null){
System.out.print(nn2.rando.lable);
nn2=nn2.next;
}
nn2 = nn1.next;
//调整复制链的rando指向对应复制链中的node
while(nn2!=null){
nn2.rando=nn2.rando.next;
if(nn2.next.next!=null){
nn2=nn2.next.next;
}else{
break;
}
}
//复制链从总链分离
while(nn3.next!=null){
nn3.next=nn3.next.next;
nn3=nn3.next;
}
System.out.println("");
System.out.print("原始链lable: ");
while(nn4.next!=null){
System.out.print(nn4.lable);
nn4=nn4.next;
}
System.out.println("");
System.out.print("复制链lable: ");
while(nn5.next!=null){
System.out.print(nn5.lable);
nn5=nn5.next;
}
}
}
class nodeIndex{
String lable;
nodeIndex next;
nodeIndex rando;
public nodeIndex(String lable, nodeIndex next, nodeIndex rando) {
super();
this.lable = lable;
this.next = next;
this.rando = rando;
}
public nodeIndex() {
super();
// TODO Auto-generated constructor stub
}
public nodeIndex copyNodeIndex(){
nodeIndex cNode1 = new nodeIndex();
cNode1.lable=lable;
cNode1.next=next;
cNode1.rando=rando;
return cNode1;
}
}