思路:
两次遍历原链表,,第一次拷贝除随机指针外的内容,第二次拷贝随机指针。
在第一次遍历的过程中要记录旧结点到新节点的映射关系,在拷贝随机指针的时候需要根据映射关系来为随机指针赋值。
/*
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;
if(pHead.next == null) return new RandomListNode(pHead.label);
RandomListNode newHead = new RandomListNode(pHead.label); // 创建一个新的头结点
RandomListNode cur = pHead.next;
RandomListNode tail = newHead;
HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
map.put(pHead,newHead);
while(cur != null){
tail.next = new RandomListNode(cur.label);
map.put(cur,tail.next);
tail = tail.next;
cur = cur.next;
}
// 进行随机指针的复制
tail = newHead;
cur = pHead;
while(cur != null){
tail.random = map.get(cur.random);
cur = cur.next;
tail = tail.next;
}
// 返回结果
return newHead;
}
}

京公网安备 11010502036488号