输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路:首先建立 一个新的链表,将原链表的 label(值)和next(指向下一个结点的变量)复制到新链表中,random的由于是任意指向的,所以我们需要将原链表的random的地址记录下来,将其结点存储在arr1中,新链表的节点存储在arr2中,然后使用int index=arr1.indexOf(p1.random)来找到random对应的数组下标,将arr1中寻找到的random复制到arr2对应的结点。最后返回新链表的头结点。
public class Solution {
public static void main(String[] args) {
RandomListNode pHead = new RandomListNode(1);
RandomListNode p1 = pHead;
p1.next = new RandomListNode(3);
p1.random =pHead;
p1 = p1.next;
p1.next = new RandomListNode(4);
p1.random = pHead;
p1 = p1.next;
p1.random = pHead;
Solution s = new Solution();
RandomListNode lHead=s.Clone(pHead);
for(int i=0;i<3;i++){
System.out.println(lHead.label);
lHead=lHead.next;
}
}
public RandomListNode Clone(RandomListNode pHead)
{ if(pHead==null) return pHead;
RandomListNode p1 = pHead;
RandomListNode lHead;
ArrayList<RandomListNode> arr1 = new ArrayList<RandomListNode>();
ArrayList<RandomListNode> arr2 = new ArrayList<RandomListNode>();
lHead = new RandomListNode(pHead.label);
RandomListNode curr = lHead;
arr1.add(pHead);
arr2.add(lHead);
while(p1.next != null){
p1 = p1.next;
RandomListNode tmp = new RandomListNode(p1.label);
curr.next =tmp;
curr = curr.next;
arr1.add(p1);
arr2.add(curr);
}
p1 = pHead;
curr = lHead;
while(p1!= null){
int index=arr1.indexOf(p1.random);
if(index!=-1)
curr.random = arr2.get(index);
curr = curr.next;
p1 = p1.next;
}
return lHead;
}
}
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}