问题描述
实现
思路可看:jz35
时间复杂度:O(N)。
空间复杂度:O(1)。
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node node = head;
//1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
while (node != null) {
Node cloned = new Node(node.val);
Node next = node.next;
node.next = cloned;
cloned.next = next;
node = next;
}
node = head;
//2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
while (node != null) {
node.next.random = node.random == null ? null : node.random.next;//node.next为克隆节点
node = node.next.next;
}
//3、拆分链表,将链表拆分为原链表和复制后的链表
node = head;
Node cloneHead = head.next;
// 注意这里和原来不一样,之前的不太容易理解
Node newHead = head.next;
while (node != null) {
node.next = node.next.next;
cloneHead.next = cloneHead.next == null ? null : cloneHead.next.next;
node = node.next;
cloneHead = cloneHead.next;
}
return newHead;
}
}
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/