题目描述
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
解析
思路
- 刚开始不明白题目的意思,翻了翻评论,是需要对此链表进行deep copy(简单来说,就是开辟独立的内存空间,对原链表进行复制。这样原链表改变时,并不会影响复制后的链表。就像画板上画了一个苹果,浅拷贝就是告诉你画板上的某个位置有个苹果,而深拷贝是在画板上重新画了一个一模一样的苹果,原来的苹果被擦掉并不影响深拷贝的苹果)。
- 继续分析题意,需要根据原链表节点node的val值构造一个新的节点copynode,同时又需要把原节点node的next、random指针所指向的节点告诉copynode,但又不能指向原来链表上的节点。这里主要的思维断点在于为何使用
HashMap
的数据结构。仔细思考。 - 代码思路:将原链表节点复制,以
<原节点,新节点>
的<K,V>
形式存储,因此:根据原节点的next、random指针的key值(即next、random节点)get到value值(即新节点的next、random节点),赋给以原节点为key的value值(即新节点)的next、random节点。(说的有点绕,直接看代码很好理解)
public Node copyRandomList(Node head) {
HashMap<Node, Node> map = new HashMap<>();
Node cur=head;
while(cur!=null) {
Node copynode = new Node(cur.val);
map.put(cur, copynode);
cur=cur.next;
}
cur=head;
while(cur!=null) {
map.get(cur).next=map.get(cur.next);
map.get(cur).random=map.get(cur.random);
cur=cur.next;
}
return map.get(head);
}