public RandomListNode copyRandomList(RandomListNode head) { /* 深复制,就是不能只是复制原链表变量,而是做一个和原来链表一模一样的新链表, 每一个节点都是新建的,而不是指向就节点 这个题的难点在于:随机节点。 随机节点有可能指向后边还没有建立的节点,这就没法指。 方法一:一一对应地记录每个新旧节点的映射关系,在常规节点建立后,就去查哈希表,找到对应 新节点的旧节点的random,就是新节点的random */ if (head==null) return null; Map<RandomListNode,RandomListNode> map = new HashMap<>(); //新节点 RandomListNode n = new RandomListNode(head.label); //记住:二叉树、链表这种前后有关联的数据结构,要迭代(注意是迭代方式)遍历的时候,一定要建立一个结构代表当前节点,往下遍历(递归看情况) RandomListNode curN=n,curO=head; map.put(curO,curN); //先复制常规节点 while (curO.next!=null) { //复制节点 curN.next = new RandomListNode(curO.next.label); curN = curN.next; curO = curO.next; //建立映射 map.put(curO,curN); } //复制random之前先初始化两个cur curN = n; curO = head; while (curN!=null) { if (curO.random!=null) { //通过映射找到random curN.random = map.get(curO.random); } curN = curN.next; curO = curO.next; } return n; }