复制带随机指针的链表
问题描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
你必须返回给定头的拷贝作为对克隆列表的引用。
解题思路
1、将原链表复制成如下链表
2、蓝色.random指向前一个结点的random的next
3、分割链表
注意:分割链表是将原链表保持原样
代码实现
/*
class Node {
public int val;
public Node next;
public Node random;
public Node() {}
public Node(int _val,Node _next,Node _random) {
val = _val;
next = _next;
random = _random;
}
}*/
class Solution {
public Node copyRandomList(Node head) {
if(head==null){
return null;
}
Node cur=head;
Node newHead=null;
//将每个结点复制链接起来
while(cur!=null){
Node node=new Node(cur.val,cur.next,null);
cur.next=node;
cur=cur.next.next;
}
//链接每个新结点的random
cur=head;
while(cur!=null){
if(cur.random==null){
cur.next.random=null;
}else{
cur.next.random=cur.random.next;
}
cur=cur.next.next;
}
//分割链表
newHead=head.next;
cur=head;
Node newCur=newHead;
while(newCur.next!=null){
cur.next=newCur.next;
newCur.next=newCur.next.next;
cur=cur.next;
newCur=newCur.next;
}
//最后将原链表的末尾指向原来的末尾
cur.next=newCur.next;
return newHead;
}
}