面试题35. 复杂链表的复制
链表深拷贝
第一步:copyList
在每个原节点后面插入复制节点
第二步:randromCopy
复制随机连接
第三步:reList
把原链表和复制的链表分离出来
java代码如下
/*
// 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;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
copyList(head);
randromCopy(head);
return reList(head);
}
public void copyList(Node head){
while(head!=null){
Node t = new Node(head.val);
t.next = head.next;
head.next = t;
head = t.next;
}
}
public void randromCopy(Node head){
while(head!=null){
head.next.random = head.random!=null ? head.random.next : null;
head = head.next.next;
}
}
public Node reList(Node head){
Node dummy = new Node(-1);
Node tmp = dummy;
while(head!=null){
tmp.next = head.next;
tmp = tmp.next;
head.next = head.next.next;
head = head.next;
}
return dummy.next;
}
}