题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:分三步 。 1.复制该链表的每一个结点到对应每个结点的后面。 2,将每个结点上的random结点复制给刚刚复制的结点,记住是random.next,3.拆分链表.
代码如下:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead == null)return pHead;
RandomListNode currentNode = pHead;
//先将该链表上的每一个结点都复制到每个结点的后面
while(currentNode != null){
RandomListNode node = new RandomListNode(currentNode.label);
node.next = currentNode.next;//先将以前的结点的next复制到重新复制的next上
currentNode.next = node;//以前的结点和复制的结点连接起来
currentNode = node.next;//然后指向复制的结点
}
//复制随机的random
currentNode = pHead;
while(currentNode != null){
RandomListNode node = currentNode.next;
if(currentNode.random != null){
node.random = currentNode.random.next;
}
currentNode = node.next;
}
//拆分复杂链表
RandomListNode pp = pHead.next;
RandomListNode tmp = null;
currentNode = pHead;
//这里的循环是将第一个结点与第三个结点相连,第二个结点与第四个结点相连
while(currentNode.next != null){
tmp = currentNode.next;
currentNode.next = tmp.next;
currentNode = tmp;
}
return pp;
}
}