描述:
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
思路:
思路:利用哈希表来存放新旧节点,key为原节点,value为新节点,一 一对应
(1)若head为空,返回null
(2)初始化一个HashMap<Node,Node>,定义cur指向head来遍历链表,循环判断若cur不为空,创建一个新节点,构造方法传入val。这样新旧节点都有了,往map里放,调用put方法,传入新旧节点,cur后移,遍历完后map里存放<原节点,新节点>
(3)把cur重新指向head,目的是再次遍历修改指向
(4)循环判断若cur不为空,(cur指向的原节点在map中的value就是新节点),新节点的next就是cur调用map.get(cur)得到的值.next,而next的相对位置也就是cur指向原节点的next节点调用map.get(cur.next)得到的值,random同理
(5)新链表的头结点就是map中键为head对应的值,同样调用map.get(head)即可
代码:
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 node = new Node(cur.val);
map.put(cur, node);
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);
}
}