方法一:
分析:
1.复制各个节点,使得原来的各个节点的next指向复制的节点
2.复制各个节点的random节点
3.把新旧节点分离
注意:不能破坏给出的节点的结构
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead){
if(pHead==null){
return null;
}
//1.复制链表,先不管random的指向
RandomListNode currentNode=pHead;
while(currentNode!=null){
RandomListNode cloneNode =new RandomListNode(currentNode.label);
RandomListNode next=currentNode.next;
currentNode.next=cloneNode;
cloneNode.next=next;
currentNode=next;
}
//2.复制random节点
currentNode=pHead;
while(currentNode!=null){
//currentNode.next.random=currentNode.random;
currentNode.next.random=currentNode.random==null?null:currentNode.random.next;
currentNode=currentNode.next.next;
}
//3.剥离除新链表
currentNode=pHead;
RandomListNode clonePHead=pHead.next;
while(currentNode!=null){
RandomListNode cloneNode=currentNode.next;
currentNode.next=cloneNode.next;
cloneNode.next=cloneNode.next==null?null:cloneNode.next.next;
currentNode=currentNode.next;
}
return clonePHead;
}
}
方法二:
分析:
用一个map存储node和clone的映射。迭代旧链表,将node之间的关系连接起来
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.*;
public class Solution {
public RandomListNode Clone(RandomListNode pHead){
if(pHead==null){
return null;
}
HashMap<RandomListNode,RandomListNode> map=new HashMap<>();
RandomListNode cnode=pHead;
while(cnode!=null){
RandomListNode clone=new RandomListNode(cnode.label);
map.put(cnode,clone);
cnode=cnode.next;
}
cnode=pHead;
while(cnode!=null){
map.get(cnode).next=map.get(cnode.next);
map.get(cnode).random=map.get(cnode.random);
cnode=cnode.next;
}
return map.get(pHead);
}
}