题目描述:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深入拷贝。
复杂链表示例:
思路:1)先遍历原链表的每个结点,新建新结点,并尾插到原链表的后面。
2)遍历链表的每个结点,设置新结点的random。
3)把一条链表拆分为原链表和新链表。
经过第一步之后,链表变为:
经过第二步,设置新结点的random后,链表变为
经过第三步,得到新链表为:
代码为:
/*
// Definition for a Node.
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;
//1)复制原链表的每个结点,并将它插入到原链表每个结点的后面。
while(cur!=null){
Node newNode=new Node(cur.val);
newNode.next=cur.next;
cur.next=newNode;
cur=newNode.next;
}
//2)修改新结点的random
cur=head;
while(cur!=null){
if(cur.random!=null){
cur.next.random=cur.random.next;//原结点的random的next才是新的random结点
}else{
cur.next.random=null;
}
if(cur.next!=null){
cur=cur.next.next;
}
}
//3)拆链表
cur=head;
Node result=head.next;
while(cur!=null){
Node newnode=cur.next;//记录新结点
cur.next=newnode.next;//修改老链表结点的next,拆开。
if(newnode.next!=null){
newnode.next=newnode.next.next;
}
cur=cur.next;
}
return result;
}
}