单链表的实现:https://blog.csdn.net/weixin_41892460/article/details/82855823
1.什么是复杂链表
一个链表的每个节点,有一个指向next指针指向下一个节点, 还有一个random指针指向这个链表中的一个随机节点或者NULL。
typedef struct ComplexNode
{
DataType _data;
struct ComplexNode* _next;
struct ComplexNode* _random;
}ComplexNode;
2.复杂链表的复制
思路
1)在每一个结点的后面连节一个和它相同数据的结点。
2)创建新结点的random,它的random 就是前面新结点的random的next。
3)将链表分离。
ComplexNode* CopyList(ComplexNode* plist)
{
ComplexNode* cur = plist;
ComplexNode* tmep = NULL;
ComplexNode* newlist = NULL;
//创建结点
while (cur != NULL)
{
ComplexNode* tmp = cur->_next;
ComplexNode* newnode = BuyComplexNode(cur->_data);
assert(newnode);
newnode->_next = tmp;
cur->_next = newnode;
cur = tmp;
}
//②复制random域
cur = plist;
while (cur != NULL)
{
tmep = cur->_next;
if (cur->_random != NULL)
tmep->_random = cur->_random->_next;
cur = tmep->_next;
}
//③拆除链表
cur = plist;
tmep = cur->_next;
newlist = tmep;
while (cur != NULL)
{
cur->_next = tmep->_next;
if (cur->_next != NULL)
tmep->_next = cur->_next->_next;
cur = cur->_next;
tmep = tmep->_next;
}
return newlist;
}
void PrintComplexList(ComplexNode* plist)
{
ComplexNode* cur = plist;
while (cur)
{
printf("%d:", cur->_data);
if (cur->_random != NULL)
{
printf("(%d)-->", cur->_random->_data);
}
else
{
printf("(NULL)-->");
}
cur = cur->_next;
}
printf("over\n");
}