给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。
样例
挑战
可否使用O(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 {
/**
* @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) {
//遍历链表,根据next复制节点,并将复制的节点插入复制节点的下一个位置
//变成原->新->原->新->原->新->null样子
RandomListNode node = head;
while(node!=null){
RandomListNode newNode = new RandomListNode(node.label);
RandomListNode tmp = node.next;
node.next = newNode;
newNode.next = tmp;
node = tmp;
}
//遍历新链表,复制randow指针关系
//newNode的randow是其原节点指向的random的下一个(根据上面插入的特性,每个新节点跟在原节点后面)
//然后删除旧节点
RandomListNode newHead = head.next;
RandomListNode preNode = new RandomListNode(0);
node = head;
while(node!=null){
RandomListNode newNode = node.next;
newNode.random = node.random==null?null:node.random.next;
node = newNode.next;
preNode.next = newNode;
preNode = newNode;
}
return newHead;
}
}