请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
思路:
思想就是 先进行复制链表,意思就是把两个链表和在一个里面,然后第一次赋值 先把random的值都给赋值成功,之后再进行拆分,因为我们那时候random已经制定好了,所以就不用怕random没有赋值了,之后按照链表的规则,把新的链表和原来的链表分割开。
/*
// 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) {
//拼接加拆分的思想
//1.先进行创建一个新的链表
if(head==null){
return null;
}
Node cur=head;
while(cur!=null){
Node temp=new Node(cur.val);
temp.next=cur.next;
cur.next=temp;
cur=temp.next;
}
//2.进行拼接操作,即让新的节点和前面的节点的random指向相同
cur=head; //重新开始
while(cur!=null){
if(cur.random!=null){
cur.next.random=cur.random.next;
}
cur=cur.next.next;
}
//3.进行拆分
Node pre=head;
//cur 表示的是 新的链表的最后一位
cur=head.next;
Node res=head.next;
while(cur.next!=null){
pre.next=pre.next.next;
cur.next=cur.next.next;
pre=pre.next;
cur=cur.next;
}
pre.next=null;
return res;
}
}