思路之一:
1、Map<Integer,RandomListNode> 存储新链表的节点
2、遍历旧链表,遍历的同时深度克隆每一个节点,并建立关系
import java.util.*;
public class Solution {
public RandomListNode Clone(RandomListNode pHead){
if(pHead==null) return null;
RandomListNode newNode = null;
RandomListNode retHead = null;
Map<Integer,RandomListNode> nodeMap = new HashMap<>();
boolean isHead = true;
while(pHead!=null){
//克隆当前节点
newNode = cloneNode(pHead.label,nodeMap);
if(pHead.random!=null){
//克隆random指针节点
newNode.random = cloneNode(pHead.random.label,nodeMap);
}
if(pHead.next!=null){
//克隆next指针节点
newNode.next = cloneNode(pHead.next.label,nodeMap);
}
if(isHead){
//记录下头节点,返回结果用
retHead = newNode;
isHead = false;
}
pHead = pHead.next;
newNode = newNode.next;
}
return retHead;
}
//克隆节点
public RandomListNode cloneNode(int label,Map<Integer,RandomListNode> map){
RandomListNode node = map.get(label);
if(node==null){
node = new RandomListNode(label);
map.put(label,node);
}
return node;
}
}
京公网安备 11010502036488号