有哪些做兼职的网站,佛山市住房和建设局网站,商务网站的推广方法有哪些,网站后台信息发布这样做题目 给你一个长度为 n 的链表#xff0c;每个节点包含一个额外增加的随机指针 random #xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点…题目 给你一个长度为 n 的链表每个节点包含一个额外增加的随机指针 random 该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。 例如如果原链表中有 X 和 Y 两个节点其中 X.random -- Y 。那么在复制链表中对应的两个节点 x 和 y 同样有 x.random -- y 。 返回复制链表的头节点。 用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示 val一个表示 Node.val 的整数。random_index随机指针指向的节点索引范围从 0 到 n-1如果不指向任何节点则为 null 。 你的代码 只 接受原链表的头节点 head 作为传入参数。 解题思路
先排除特殊情况若链表为null则直接返回null使用Map存储原始链表的节点和对应索引使用List来存储复制后链表的节点while循环完成节点复制、next链接和存储从Map和List中获取首节点进行第二次遍历;第二次遍历建立random链接。
代码展示
class Solution {public Node copyRandomList(Node head) {//排除特殊情况if (head null){return null;}Node ans new Node(head.val);//需要获取random的索引所以用map比遍历List要便捷MapNode, Integer headMap new HashMap();//只需要根据索引获取对应节点List本身是有序的所以不需要用MapListNode ansList new ArrayList();int index 0;headMap.put(head, index);ansList.add(ans);//遍历生成所有节点并存储起来while (head.next ! null){head head.next;ans.next new Node(head.val);index;headMap.put(head, index);ansList.add(ans.next);ans ans.next;}for (Node node : headMap.keySet()){if(headMap.get(node) 0){head node;break;}}ans ansList.get(0);while (head ! null ans ! null){Integer num headMap.get(head.random);Node temp null;if(num ! null){temp ansList.get(num);}ans.random temp;head head.next;ans ans.next;}return ansList.get(0);}
}