题目描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
提示:
-10000 <= Node.val <= 10000
Node.random
为空(null)或指向链表中的节点。- 节点数目不超过 1000 。
解题思路:
本题链表的节点定义如下:
// Definition for a Node. class Node { int val; Node next, random; public Node(int val) { this.val = val; this.next = null; this.random = null; } }
本题难点: 在复制链表的过程中构建新链表各节点的 random
引用指向。
利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next
和 random
引用指向即可。
class Solution{ public Node copyRandomList(Node head){ if(head == null) return null; Node cur = head; Map<Node ,Node> map = new HashMap<>(); // 3. 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射 while(cur!=null){ map.put(cur,new Node(cur.val)); cur=cur.next; } cur=head; // 4. 构建新链表的 next 和 random 指向 while(cur!=null){ map.get(cur).next = map.get(cur.next); map.get(cur).random = map.get(cur.random); cur = cur.next; } // 5. 返回新链表的头节点 return map.get(head); } }
标签:Node,cur,Offer,random,35,next,链表,节点 From: https://www.cnblogs.com/zhz123567/p/17412036.html