复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
//ps: 复杂链表的结构
struct ComplexNode
{
int _data ; // 数据
struct ComplexNode * _next; // 指向下一个节点的指针
struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空)
};
分析:
对于节点单个依次复制之后再将random指针依次后移。将原来的节点删掉之后依次链接复制后的节点
ComplexNode* CopyList(ComplexNode* plist)
{
if (plist == NULL)
{
return NULL;
}
ComplexNode* newnode = NULL;
ComplexNode* tmp = plist;
//1.1 插入节点
while (tmp != NULL)
{
newnode = (ComplexNode*)malloc(sizeof(ComplexNode));
newnode->_data = tmp->_data;
newnode->_next = tmp->_next;
newnode->_random = NULL;
tmp->_next = newnode;
tmp = tmp->_next->_next;
}
//1.2开始连接random
tmp = plist;
newnode = plist->_next;
while (tmp != NULL)
{
if (tmp->_random != NULL)
{
newnode->_random = tmp->_random->_next;
}
tmp = tmp->_next->_next;
if (tmp)
{
newnode = tmp->_next;
}
}
//2.分离两个链表
ComplexNode* res = plist->_next;
tmp = plist;
tmp->_next = tmp->_next->_next;
tmp = tmp->_next;
newnode = plist->_next;
while ((tmp->_next != NULL)&&(tmp != NULL))
{
newnode->_next = newnode->_next->_next;
tmp->_next = tmp->_next->_next;
tmp = tmp->_next;
newnode = newnode->_next;
}
return res;
}
void Test1()
{
ComplexNode* list = NULL;
ComplexNode* node1 = PushBack(&list, 2);
ComplexNode* node2 = PushBack(&list, 5);
ComplexNode* node3 = PushBack(&list, 6);
node1->_random = node3;
node2->_random = node1;
node3->_random = node2;
ComplexNode* res = CopyList(list);
}