题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路
1.实现a-acopy-b-bcopy结构
2.实现random指针的连接(原来节点的下一个是他的复制节点,根据原来节点的random指针可以找到原来节点的random,他的random下一个位置就是复制节点的random应该连接的节点)
3.拆分为两个链表(ab acopy-bcopy)
代码
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
CloneNodes(pHead);
ConnectionSiblingNodes(pHead);
return ReConnectNodes(pHead);
}
//1.复制为1 1~ 2 2~
public void CloneNodes(RandomListNode pHead)
{
RandomListNode pNode=pHead;
while(pNode!=null){
RandomListNode pCloned=new RandomListNode(pNode.label);
pCloned.next=pNode.next;//复制节点指向的是原来节点的下一个
pCloned.random=null;
pNode.next=pCloned;//原来的节点指向复制节点
pNode=pCloned.next;//下一个操作的节点是复制节点的下一个(也就是原来节点的下一个结点)
}
}
//2.连接复制链表的随机节点
public void ConnectionSiblingNodes(RandomListNode pHead)
{
RandomListNode pNode=pHead;
while(pNode!=null){
RandomListNode pCloned=pNode.next;
if(pNode.random!=null){
pCloned.random=pNode.random.next;
}
pNode=pCloned.next;
}
}
//3.拆分为2个链表(要有返回复制的头结点)
public RandomListNode ReConnectNodes(RandomListNode pHead){
RandomListNode pNode=pHead;//pNode是操作的原来链表中的节点
RandomListNode pClonedHead=null;//pClonedHead返回的复制链表的头结点
RandomListNode pClonedNode=null;//pClonedNode是操作的复制链表中的节点
if(pNode!=null){
pClonedHead=pClonedNode=pNode.next;
pNode.next=pClonedNode.next;//原来链表的头结点指向下一个结点
pNode=pNode.next;
}
//从原来的链表的第二个节点开始操作
while(pNode!=null){
pClonedNode.next=pNode.next;//复制节点的下一个是原来节点的下一个
pClonedNode=pClonedNode.next;//复制节点移到他的下一个
pNode.next=pClonedNode.next;//原来节点的下一个是复制节点的下一个
pNode=pNode.next;//原来节点向下移一个
}
return pClonedHead;
}
}