题目如下:
思路:
1、先复制原始链表
2、由于还有个random指针,因此使用一个HashMap来保存,其中,以原始链表的结点作为值,对应的复制链表的结点作为键
源代码:
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
if(head==null)
return null;
Node copyHead=new Node(-1);
copyHead.val=head.val;
// if(head.next==null)
// return copyHead;
//先复制链表,同时以原链表的结点作为键,复制链表的结点作为值,建立一个Hash表
Node tmpCopyHead=copyHead;
Node tmpHead=head;
HashMap<Node,Node> hashmap=new HashMap<>();
//从第二个结点开始复制,因此在这里要先将其放置hashmap中
hashmap.put(tmpHead,tmpCopyHead);
tmpHead=tmpHead.next;
while(tmpHead!=null)
{
Node nextNode=new Node(-1);
nextNode.val=tmpHead.val;
hashmap.put(tmpHead,nextNode);
tmpCopyHead.next=nextNode; //建立复制链表
tmpCopyHead=tmpCopyHead.next;
tmpHead=tmpHead.next;
}
//建立random
tmpCopyHead=copyHead;
tmpHead=head;
while(tmpHead!=null)
{
if(tmpHead.random!=null)
{
tmpCopyHead.random=hashmap.get(tmpHead.random);
}
tmpCopyHead=tmpCopyHead.next;
tmpHead=tmpHead.next;
}
return copyHead;
}
}