题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路分析:
第一步:复制原始链表的任一节点N,并创建新的节点N‘,将N'链接在N后面。
第二步:设置复制出来节点的随意指针,如果原始链表上的节点N的随意指针指向S,那么它的复制节点N’的随意指针指向S'
第三步:将复制链表拆分出来。
代码:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
//第一步,复制节点,放到原节点的下一个节点
public void CloneNodes(RandomListNode pHead){
RandomListNode pNode=pHead;
while(pNode!=null){
RandomListNode pCloned=new RandomListNode(-1);
pCloned.label=pNode.label;
pCloned.next=pNode.next;
pCloned.random=null;
pNode.next=pCloned;
pNode=pCloned.next;
}
}
//第二步,复制随机指针,原节点随机指针指向的节点的下一个节点就是复制节点随机指针指向的节点节点
public void RandomClone(RandomListNode pHead){
RandomListNode pNode=pHead;
while(pNode!=null){
RandomListNode pClonedNode=pNode.next;
if(pNode.random!=null)
pClonedNode.random=pNode.random.next;
pNode=pClonedNode.next;
}
}
//第三步,将复制的链表从长链表中拆分出来
public RandomListNode CloneList(RandomListNode pHead){
RandomListNode pNode=pHead;
RandomListNode pCloneHead=null;
RandomListNode pCloneNode=null;
if(pNode!=null){
pCloneHead=pNode.next;
pCloneNode=pNode.next;
pNode.next=pCloneNode.next;
pNode=pNode.next;
}
while(pNode!=null){
pCloneNode.next=pNode.next;
pCloneNode=pCloneNode.next;
pNode.next=pCloneNode.next;
pNode=pNode.next;
}
return pCloneHead;
}
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null)
return null;
CloneNodes(pHead);
RandomClone(pHead);
return CloneList(pHead);
}
}