【数据结构】单链表--复杂链表的复制

 在学习链表的最后,我们接触了复杂链表。一个链表的每个节点,有一个指向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;
}



猜你喜欢

转载自blog.csdn.net/qq_32672481/article/details/73294439
今日推荐