在学习链表的最后,我们接触了复杂链表。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。
首先定义链表结构:
typedef struct ComplexNode//复杂链表的结构
{
DataType data;
struct ComplexNode *_next;
struct ComplexNode *_random;
}ComplexNode;
复杂链表的动态开辟,与主函数的测试:
ComplexNode *BuyComplexNode(DataType x)//复杂链表的动态开辟
{
ComplexNode *node = (ComplexNode*)malloc(sizeof(ComplexNode));
node->data = x;
node->_next = NULL;
node->_random = NULL;
return node;
}
//复杂链表的复制
void TestList()
{
ComplexNode *node1 = BuyComplexNode(1);
ComplexNode *node2 = BuyComplexNode(2);
ComplexNode *node3 = BuyComplexNode(3);
ComplexNode *node4 = BuyComplexNode(4);
ComplexNode *node5 = BuyComplexNode(5);
node1->_next = node2;
node1->_random = node3;
node2->_next = node3;
node2->_random = node1;
node3->_next = node4;
node3->_random = NULL;
node4->_next = NULL;
node4->_random = node4;
ComplexNode *node = CopyComNode(&node1);
}
int main()
{
TestList();
return 0;
}
复杂链表复制的方法思想:
ComplexNode* CopyComNode(ComplexNode **ppList)//复制复杂链表
{
ComplexNode *cur = *ppList;
ComplexNode *node = *ppList;
//节点插在后面
while (*ppList)
{
ComplexNode *Node = BuyComplexNode((*ppList)->data);
ComplexNode *tmp = (*ppList)->_next;
(*ppList)->_next = Node;
Node->_next = tmp;
*ppList = tmp;
}
//新节点的random置好
while (cur)
{
if (cur->_random)
cur->_next->_random = cur->_random->_next;
else
cur->_next->_random = NULL;
cur = cur->_next->_next;
}
//取出新节点
ComplexNode *first = node->_next;
*ppList = node;
while (node)
{
ComplexNode *tmp = node->_next;
node->_next = node->_next->_next;
if (tmp->_next)
tmp->_next = tmp->_next->_next;
else
tmp->_next = NULL;
node = node->_next;
}
return first;
}