先水过,然后再学题解
import java.util.HashMap;
import java.util.Map;
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) {
if (head == null) {
return null;
}
// before to new
Map<Node, Node> map = new HashMap<>();
Node ans = new Node(head.val);
map.put(head, ans);
Node now = ans;
Node temp = head;
while (temp.next != null) {
temp = temp.next;
now.next = new Node(temp.val);
now = now.next;
map.put(temp, now);
}
now.next = null;
now = ans;
temp = head;
while (temp != null) {
now.random = map.get(temp.random);
now = now.next;
temp = temp.next;
}
return ans;
}
}
题解的做法就是先在每个节点后加一个相同的辅助节点,借助这些节点来完成拷贝,注意结束的时候要将原链表还原。
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
for (Node node = head; node != null; node = node.next.next) {
Node nodeNew = new Node(node.val);
nodeNew.next = node.next;
node.next = nodeNew;
}
for (Node node = head; node != null; node = node.next.next) {
Node nodeNew = node.next;
nodeNew.random = (node.random != null) ? node.random.next : null;
}
Node headNew = head.next;
for (Node node = head; node != null; node = node.next) {
Node nodeNew = node.next;
node.next = node.next.next;
nodeNew.next = (nodeNew.next != null) ? nodeNew.next.next : null;
}
return headNew;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/fu-za-lian-biao-de-fu-zhi-by-leetcode-so-9ik5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。