Copy List with Random Pointer
27% Accepted
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.
Challenge
Could you solve it with O(1) space?
Tags Expand
- Hash Table
- Linked List
思路
- 第一种思路是创建一个正常链表,用hashmap来存储随机结点,但是这样空间是O(n)
- 第二种思路是对链表进行三次扫描
- 第一次扫描对每个结点进行复制,链表的下一个值是自己的复制,然后是下一个值
- 1->2->3->4->5->6变成 1->1->2->2->3->3->4->4->5->5->6->6
- 第二次扫描中我们把旧结点的随机指针赋给新节点的随机指针, 因为新结点都跟在旧结点的下一个值得注意的是,要赋值到新节点的随机值,node.random.next,其中node.next就是新结点
- 最后将链表拆开,跳着赋值拆开就可以了
方法一
/**
* 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 {
/**
* @param head: The head of linked list with a random pointer.
* @return: A new head of a deep copy of the list.
*/
public RandomListNode copyRandomList(RandomListNode head) {
// write your code here
if (head == null) {
return head;
}
HashMap<RandomListNode, RandomListNode> hashmap = new HashMap<RandomListNode, RandomListNode>();
RandomListNode dummy = new RandomListNode(0);
dummy.next = head;
RandomListNode newdummy = new RandomListNode(0);
RandomListNode newNode = newdummy;
while (head != null) {
RandomListNode copy = new RandomListNode(head.label);
newNode.next = copy;
hashmap.put(head, copy);
newNode = newNode.next;
head = head.next;
}
newNode = newdummy.next;
head = dummy.next;
while (head != null) {
RandomListNode randomnode = hashmap.get(head.random);
newNode.random = randomnode;
head = head.next;
newNode = newNode.next;
}
return newdummy.next;
}
}
方法二
/**
* 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 {
/**
* @param head: The head of linked list with a random pointer.
* @return: A new head of a deep copy of the list.
*/
public RandomListNode copyRandomList(RandomListNode head) {
// write your code here
if (head == null) {
return head;
}
RandomListNode dummy = new RandomListNode(0);
dummy.next = head;
while (head != null) {
RandomListNode newNode = new RandomListNode(head.label);
RandomListNode next = head.next;
head.next = newNode;
newNode.next = next;
head = next;
}
head = dummy.next;
while (head != null) {
RandomListNode random = head.random;
if (random != null) {
head.next.random = random.next;
}
head = head.next.next;
}
RandomListNode pre = dummy;
head = dummy.next;
while (head != null) {
RandomListNode next = head.next;
pre.next = next;
head = head.next.next;
pre = next;
}
return dummy.next;
}
}