题目描述:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
思路:双指针
看到这道题的时候,我的第一个思路就是遍历链表,但是如果链表存在环的化,那么程序会永远执行下去。所以想到了使用hashmap数据结构;
原地处理,将克隆结点放在原结点后面,在原链表上处理克隆结点的random指针,最后分离两个链表
具体详见代码所示:
/*
// Definition for a Node.
class Node {
public int val;
public Node next;
public Node random;
public Node() {}
public Node(int _val,Node _next,Node _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public Node copyRandomList(Node head) {
if(head==null) return null;
HashMap<Node,Node> map=new HashMap<>();
Node cur=head;
while(cur!=null){
Node clone=new Node(cur.val,null,null);
map.put(cur,clone);
cur=cur.next;
}
cur=head;
while(cur!=null){
map.get(cur).next=map.get(cur.next);
map.get(cur).random=map.get(cur.random);
cur=cur.next;
}
return map.get(head);
}
}