题目描述:
请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
样例:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
分析:
第一步:对链表中的每一个节点进行复制,并将被复制节点的next指针指向复制节点。
第二步:对复制节点的随机指针赋值,即a1.random=a.random.next
第三步:拆分链表,将链表拆分为新复制的链表和原链表。
//执行用时 : 1 ms, 在Copy List with Random Pointer的Java提交中击败了99.71% 的用户
//内存消耗 : 32.8 MB, 在Copy List with Random Pointer的Java提交中击败了88.33% 的用户
public Node copyRandomList(Node head) {
if(head==null)
return head;
Node h=head;
while(h!=null) {
Node next=h.next;
Node clone=new Node();
clone.val=h.val;
h.next=clone;
clone.next=next;
h=next;
}
h=head;
while(h!=null) {
if(h.random!=null)
h.next.random=h.random.next;
else
h.next.random=null;
if(h.next==null)
break;
h=h.next.next;
}
h=head;
Node clone=h.next;
while(h!=null) {
Node p=h.next;
h.next=p.next;
if(p.next!=null)
p.next=p.next.next;
else
p.next=null;
h=h.next;
}
return clone;
}