思路:
遍历第一遍时,在原结点的后面复制该节点;
遍历第二遍时,复制随机指针;
遍历第三遍时,分离原链表和副本。
注意:有些地方比如随机指针,需要判断,只有在确认不为空时,才能用.next.
public Node copyRandomList1(Node head)
{
if(head==null)
{
return null;
}
// copy
Node cur = head;
Node next = null;
while(cur!=null)
{
next = cur.next;
cur.next = new Node(cur.val);
cur.next.next = next;
cur = next;
}
// copy random
Node rand=null;
cur = head;
while(cur!=null)
{
rand = cur.random;
cur.next.random = rand==null?null:rand.next;
cur= cur.next.next;
}
// separate
Node head2 = head.next;
Node cur2 = head2;
cur = head;
while(cur!=null)
{
next = cur.next.next;
cur.next =next;
cur2.next = next==null?null:next.next;
cur = cur.next;
cur2 = cur2.next;
}
return head2;
}