原题网址:https://leetcode.com/problems/copy-list-with-random-pointer/
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
方法一:使用哈希映射保存拷贝过的节点。
/**
* 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 {
private Map<Integer, RandomListNode> nodes = new HashMap<>();
public RandomListNode copyRandomList(RandomListNode head) {
if (head == null) return null;
RandomListNode copied = nodes.get(head.label);
if (copied == null) {
copied = new RandomListNode(head.label);
nodes.put(head.label, copied);
copied.next = copyRandomList(head.next);
copied.random = copyRandomList(head.random);
}
return copied;
}
}
方法二:新拷贝的节点插入到原节点后面。
/**
* 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 {
/*
http://www.cnblogs.com/TenosDoIt/p/3387000.html
*/
public RandomListNode copyRandomList(RandomListNode head) {
if (head == null) return null;
RandomListNode current = head;
while (current != null) {
RandomListNode next = current.next;
RandomListNode copied = new RandomListNode(current.label);
current.next = copied;
copied.next = next;
current = next;
}
current = head;
while (current != null) {
if (current.random != null) current.next.random = current.random.next;
current = current.next.next;
}
RandomListNode result = head.next;
RandomListNode origin = head, copied = head.next;
while (copied.next != null) {
origin.next = origin.next.next;
origin = origin.next;
copied.next = copied.next.next;
copied = copied.next;
}
origin.next = null;
copied.next = null;
return result;
}
}
注意,随机指针的修改要在第二轮完成,而next指针要在第三轮完成,否则会有问题。