两次遍历。
请一定要明白每次从map取出的value是啥,不要搞混啊。
对于空间为1的做法,之后看点击打开链接
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if (head == null) {
return null;
}
Map<RandomListNode, RandomListNode> map = new HashMap<>();
RandomListNode newHead = new RandomListNode(head.label);
map.put(head, newHead);
RandomListNode node = head.next;
RandomListNode prevCopy = newHead;
while (node != null) {
RandomListNode curCopy = new RandomListNode(node.label);
map.put(node, curCopy);
prevCopy.next = curCopy;
prevCopy = curCopy;
node = node.next;
}
node = head;
while(node!=null)
{
RandomListNode nodeCopy = map.get(node);
RandomListNode randomCopy = map.get(node.random);
if (randomCopy != null) {
nodeCopy.random = randomCopy;
}
node = node.next;
}
return newHead;
// if (head == null) {
// return null;
// }
// Map<RandomListNode, RandomListNode> map = new HashMap<>();
// RandomListNode copyNode = new RandomListNode(head.label);
// map.put(head, copyNode);
// RandomListNode node = head.next;
// RandomListNode prevCopy = copyNode;
// while (node != null) {
// RandomListNode curCopy = new RandomListNode(node.label);
// map.put(node, curCopy);
// prevCopy.next = curCopy;
// prevCopy = curCopy;
// node = node.next;
// }
// node = head;
// while (node != null) {
// RandomListNode nodeCopy = map.get(node);
// RandomListNode nodeRandom = map.get(node.random);
// if (nodeRandom != null) {
// RandomListNode nodeRandomCopy = map.get(nodeRandom);
// nodeCopy.random = nodeRandomCopy;
// }
// node = node.next;
// }
// //return map.get(head);
// return copyNode;
}
}