刷题-复杂链表的复制

Posted on 2022-02-01 23:31  AcTourist  阅读(35)  评论(0)    收藏  举报

一、题目

 

 

二、重点难点分析

  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 };