请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
来源:剑指Offer
class Solution {
public Node copyRandomList(Node head) {
if(head==null)return null; //判断头节点是否为空,如果空则空
Node cur=head; //指针,当前节点指向头节点
Map<Node,Node>map=new HashMap<>();//节点构造哈希表
while(cur!=null){
map.put(cur,new Node(cur.val));//复制各节点,建立映射关系
cur=cur.next;//遍历原节点下一节点
}
cur=head;//指向头节点
while(cur!=null){
map.get(cur).next=map.get(cur.next);
map.get(cur).random=map.get(cur.random);//构建next和random的指向
cur=cur.next;
}
return map.get(head);//返回新链表的头节点
}
}
本题链表的节点新增了 random 指针,指向链表中的 任意节点 或者 nullnull 。这个 random 指针意味着在复制过程中,除了构建前驱节点和当前节点的引用指向 pre.next ,还要构建前驱节点和其随机节点的引用指向 pre.random 。
本题难点: 在复制链表的过程中构建新链表各节点的 random 引用指向。
引用指向重点在于设立哈希表,进行映射的复制与指向