复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
//ps: 复杂链表的结构
struct ComplexNode
{
int data ; // 数据
struct ComplexNode *next; // 指向下一个节点的指针
struct ComplexNode *random; // 指向随机节点(可以是链表中的任意节点 or 空)
};
思路:
1.在每个节点后面copy一个一模一样的节点,构成一个新链
2.plist中每个节点random后面的那个节点,就是他复制品的random
3.把复制品从原链表中提取出来即为所求
代码如下:
struct ComplexNode
{
int data ; // 数据
struct ComplexNode * next; // 指向下一个节点的指针
struct ComplexNode * random; // 指向随机节点(可以是链表中的任意节点 or 空)
};
//复杂链表的复制。
//一个链表的每个节点,有一个指向next指针指向下一个节点,
//还有一个random指针指向这个链表中的一个随机节点或者NULL,
//现在要求实现复制这个链表,返回复制后的新链表
ComplexNode* BuyNode(int data); //创建节点
ComplexNode* CopyComplexNode(ComplexNode* plist); //复制
void Print(ComplexNode* plist); //打印
ComplexNode* BuyNode(int data)
{
ComplexNode* p = (ComplexNode*)malloc(sizeof(ComplexNode));
p->data = data;
p->next = NULL;
p->random = NULL;
return p;
}
ComplexNode* CopyComplexNode(ComplexNode* plist)
{
ComplexNode* cur = plist;
if(plist == NULL)
{
return NULL;
}
else if(plist->next == NULL)
{
return BuyNode(plist->data);
}
else
{
//每个节点后面插入相同的节点
while (cur)
{
ComplexNode* tmp = BuyNode(cur->data);
tmp->next = cur->next;
cur->next = tmp;
//cur每次往后移2个,因为整个链表是偶数个节点所以不会跳到NULL后面
cur = tmp->next;
}
//求复制品的random
//*注意:分类讨论,random为空或不为空
cur = plist;
while(cur)
{
//如果当前random为空,复制品的random也是空
//否则复制品的random,指向当前节点random的下一个节点(这里忘了分类会挂掉)
if(cur->random == NULL)
{
cur->next->random = NULL;
}
else
{
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//复制品提取构成新链表
ComplexNode* newlist = plist->next;
cur = plist->next;
while(cur->next)
{
cur->next = cur->next->next; //前面的节点指向他后面第二个节点
cur = cur->next;
}
cur->next = NULL; //最后一个节点指向空
return newlist;
}
}
void Print(ComplexNode* plist)
{
ComplexNode* cur = plist;
while(cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void test()
{
ComplexNode* node1 = BuyNode(1);
ComplexNode* node2 = BuyNode(2);
ComplexNode* node3 = BuyNode(3);
ComplexNode* node4 = BuyNode(4);
ComplexNode* node5 = BuyNode(5);
node1->next = node2;
node1->random = node3;
node2->next = node3;
node2->random = node1;
node3->next = node4;
node3->random = NULL;
node4->next = node5;
node4->random = node5;
node5->random = node5;
Print(node1);
ComplexNode* newlist = CopyComplexNode(node1);
Print(newlist);
}