题目如下:
可以看出题意是复制带有random指针的链表,该random指针可以指向链表中的任意节点或者null。如果不含有这个random指针,则复制会非常简单,就是每次开辟一个节点前后相连即可。但现在需要时刻保存链表中所有节点的引用信息,使得random指针可以任意的指向链表中的任意节点。
所以这里使用了HashMap<Node, Node>的数据结构,key值存的是原始链表,value则是要去得到的复制后的链表。代码如下:
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
Node cur = head;
Map<Node, Node> mp = new HashMap<>();
while(cur!=null)
{
mp.put(cur, new Node(cur.val));
cur = cur.next;
}
cur = head;
while(cur!=null)
{
mp.get(cur).next = mp.get(cur.next);
mp.get(cur).random = mp.get(cur.random);
cur = cur.next;
}
return mp.get(head);
}
}
首先循环一遍原始链表,创建与原始链表每个节点的val相等的若干节点,与原始链表的节点以Entry的形式put到Map中。此时Map的value部分的每个节点只有值val,而没有next和random,但已经存下了每个节点的引用。因此接下来再遍历一次即可。
这里HashMap运用的比较灵活,mp.get(cur.next)返回的是一个Node,标志着与cur节点的下一个节点的val相等的节点(两者组成Entry)。