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.
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null)
return null;
//duplicate
RandomListNode dhead = new RandomListNode(head.label);
RandomListNode pd = dhead, ph = head;
//assignment of next
for(;ph != null;ph = ph.next){
if(ph.next != null){
pd.next = new RandomListNode(ph.next.label);
pd = pd.next;
}else{
pd.next = null;
}
// System.out.println("!!!");//
}
//assignment of random, all members already in the ph list
pd = dhead; ph = head;
for(;pd != null;pd = pd.next, ph = ph.next){
if(ph.random != null){
pd.random = findRandom(dhead, ph.random);
}else{
pd.random = null;
}
// System.out.println("$$$");//
}
return dhead;
}
private RandomListNode findRandom(RandomListNode dhead, RandomListNode target){
RandomListNode p = dhead;
for(;p != null;p = p.next){
// System.out.println("###");//
if(target.label == p.label)
return p;
}
return null;
}
}
原理:1.先不管random,通过建立next建立单向链表dhead,之后random指向的节点肯定在dhead中,查找连接即可。