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.
这道题的意思是让完全拷贝一个链表。
方法一:第一次遍历用hashmap存对应的节点,第二次遍历存储相应的next和random节点。代码如下:
/**
* 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) {
HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
RandomListNode tempNode = head;
while (tempNode != null) {
map.put(tempNode, new RandomListNode(tempNode.label));
tempNode = tempNode.next;
}
tempNode = head;
while (tempNode != null) {
map.get(tempNode).next = map.get(tempNode.next);
map.get(tempNode).random = map.get(tempNode.random);
tempNode = tempNode.next;
}
return map.get(head);
}
}
方法二:在每个节点后面插入一个一模一样的节点,再把这两个链表分开。代码如下:
/**
* 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) {
RandomListNode cur = head, next;
while(cur != null) {
next = cur.next;
RandomListNode node = new RandomListNode(cur.label);
node.next = next;
cur.next = node;
cur = next;
}
cur = head;
while(cur != null) {
if (cur.random != null)
cur.next.random = cur.random.next;
cur = cur.next.next;
}
cur = head;
RandomListNode reshead = new RandomListNode(0);
RandomListNode temp = reshead, tempNext;
while (cur != null) {
next = cur.next.next;
tempNext = cur.next;
temp.next = tempNext;
temp = tempNext;
cur.next = next;
cur = next;
}
return reshead.next;
}
}