题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
/*
1.将链表的每个结点都复制一个,连接到原来每个结点后面,即A-A'-B-B'-C-C'
2.修改每个复制结点的随机指针random
3.将链表拆成两个链表
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null) return null;
RandomListNode p=pHead;
//复制结点,并用next指向复制后的结点
while(p!=null){
RandomListNode t=new RandomListNode(p.label);
t.next=p.next;
p.next=t;
p=t.next;
}
//修改复制结点的random
p=pHead;
while(p!=null){
if(p.random!=null) {
p.next.random=p.random.next;
}
p=p.next.next;
}
RandomListNode ret=pHead.next;
//拆开链表,多次循环,每次都是讲当前结点p的next修改为下一个结点的next指向的结点
p=pHead;
while(p.next!=null){
//保存下一个结点的指针
RandomListNode temp=p.next;
//当前结点的next指向下一个结点的下一个结点
p.next=temp.next==null?null:temp.next;
//当前结点后移一个结点
p=temp;
}
return ret;
}
}