剑指Offer每日一题12
面试题35. 复杂链表的复制
请实现 copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next
指针指向下一个节点,还有一个 random
指针指向链表中的任意节点或者 null
。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
提示:
-10000 <= Node.val <= 10000
Node.random
为空(null)或指向链表中的节点。- 节点数目不超过 1000 。
花的时间有点长
欸,陷入思绪,从简从简
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
class Work{
public Node copyList(Node head) {
if(head==null){
return null;
}
copy(head); //在原链表上元素向后复制一个
randomDirect(head); //连随机指针
return result(head); //分开
}
private void copy(Node head){
while(head!=null){
Node cloneNode = new Node(head.val); //复制新结点
Node nextNode = head.next; //插入新结点
head.next = cloneNode;
cloneNode.next = nextNode;
head = cloneNode.next; //移动到下一个要复制的结点
}
}
private void randomDirect(Node head){
while(head!=null){
Node cloneNode = head.next;
if(head.random!=null){
Node direct = head.random; //连随机指针
cloneNode.random = direct.next;
}
head = cloneNode.next;
}
}
private Node result(Node head){ //分成两个链表,并返回复制的新链表
Node cloneNode = head.next;
Node cloneHead = cloneNode;
head.next = cloneNode.next;
head = head.next;
while(head!=null){
cloneNode.next = head.next;
head.next = head.next.next;
head = head.next;
cloneNode = cloneNode.next;
}
return cloneHead;
}
}