输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空
此题是一个复杂链表的复制,我们的思路分为三部分。
1、根据原始链表的每个结点N创建对应的N’,再把N’放到N的后面。
2、设置复制出来的结点的random结点,假设原始链表上的N的random指向结点S,那么其对应复制出来的N’是N的next指向的结点,同样S’也是S的next指向的结点
3、把这个长链表拆分成两个链表,偶数位置的结点链接起来就是复制出来的链表。
下面来实现以下代码
/*
struct RandomListNode{
int label;
struct RandomListNode *next,*random;
RandomListNode(int x);
label(x),next(NULL),random(NULL){
};
*/
class Solution{
public:
RandomListNode* Clone(RandomListNode* pHead){
if(pHead == NULL)
{
return NULL;
}
//第一步:根据原始结点N创建新结点N',N'链接到N后面
//A-B-C-D-E
//A-A'-B-B'-C-C'-D-D'-E-E'
andomListNode* node = pHead;
while(node != NULL)
{
RandomListNode* cloneNode = new RandomListNode(0);
cloneNode->label = node->label;
cloneNode->next = node->next;
node->next = cloneNode;
node = cloneNode->next;
}
//第二步:设置复制出来的random
RandomListNode* node1 = pHead;
while(node1 != NULL)
{
RandomListNode* cloneNode1 = node1->next;
if(node1->random != NULL)
{
cloneNode1->random = node1->random->next;
}
node1 = cloneNode1->next;
}
//第三部:把长链表拆开成两个链表,偶数位置的为复制链表
RandomListNode* nodeEven = NULL;
RandomListNode* nodeEvenHead = NULL;
RandomListNode* node2 = pHead;
if(node2 != NULL)
{
nodeEven = nodeEvenHead = node2->next;
node2->next = nodeEven->next;
node2 = node2->next;
}
while(node2 != NULL)
{
nodeEven->next = node2->next;
nodeEven = nodeEven->next;
node2->next = nodeEven->next;
node2 = node2->next;
}
return nodeEvenHead;
}
};