一、题目

二、重点难点分析
1.怎么确定random在新的节点的位置
2.为什么要用map?答:map函数有键值关系,先确定好旧链表的键值关系,在从新的链表里利用旧链表里的键key配对random(就是值)
3.new 一个map出来,按着(node,node.val)传入进到map里(node是head,node.val是random)
4.要注意一点:假如random 和 next都为空,如果map里面没有,就会报错
5.第二个while 是配对,从map里找到旧链表的key,然后寻找到random(值),配对完后会更新map,所以最后只要return一个head即可。
三、代码
1 /** 2 * // Definition for a Node. 3 * function Node(val, next, random) { 4 * this.val = val; 5 * this.next = next; 6 * this.random = random; 7 * }; 8 */ 9 10 /** 11 * @param {Node} head 12 * @return {Node} 13 */ 14 var copyRandomList = function(head) { 15 if(!head) return null; 16 let node = head; 17 let map = new Map(); 18 19 while( node ){ 20 map.set( node , new Node( node.val )); 21 node = node.next; 22 } 23 map.set(null,null); 24 node = head; 25 26 while( node ) 27 { 28 map.get(node).random=map.get(node.random); 29 map.get(node).next=map.get(node.next); 30 node = node.next; 31 } 32 return map.get(head); 33 };
浙公网安备 33010602011771号