剑指offer--复杂链表的复制

题目详情:复杂链表的复制;链表节点会存在一个随机指针,它会指向任意节点或NULL,请完成它的复制。

节点结构体:

typedef struct ComplexNode{

	int _data; // 数据 

	struct ComplexNode * _next; // 指向下一个节点的指针 

	struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空) 
	ComplexNode(int data)
		:_data(data)
		, _next(NULL)
		, _random(NULL)
	{}

}ComplexNode;


题目思路:

时间复杂度为O(n)

1、将链表的每个节点复制拷贝一份,并将random指针设为空,将拷贝的链表节点连接在原节点的后面;

2、将链表中的原节点的random的指针复制给拷贝后的结点,例p1的random指针指向p3,则p1^指向p3^;

3、将链表中的原节点与拷贝后的结点进行分离;

剑指offer--复杂链表的复制_第1张图片

代码实现:

typedef struct ComplexNode{

	int _data; // 数据 

	struct ComplexNode * _next; // 指向下一个节点的指针 

	struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空) 
	ComplexNode(int data)
		:_data(data)
		, _next(NULL)
		, _random(NULL)
	{}

}ComplexNode;

ComplexNode* Cope(ComplexNode* Head)
{
	ComplexNode* ptr = Head;
	while (ptr != NULL)
	{
		ComplexNode* node = new ComplexNode(ptr->_data);
		node->_next = ptr->_next;
		ptr->_next = node;

		ptr = node->_next;
	}


	ptr = Head;
	while (ptr != NULL)
	{
		if (ptr->_random != NULL)
		{
			ptr->_next->_random = ptr->_random->_next;
		}
		ptr = ptr->_next->_next;
	}

	ptr = Head;
	ComplexNode* newHead = NULL;
	ComplexNode* newNode = NULL;
	if (ptr != NULL)
	{
		newNode = newHead = ptr->_next;
		ptr->_next = newNode->_next;
		ptr = ptr->_next;
	}
	while (ptr != NULL)
	{
		newNode->_next = ptr->_next;
		newNode = newNode->_next;

		ptr->_next = newNode->_next;
		ptr = ptr->_next;
	}
	return newHead;
}

测试用例:

void Text()
{
	ComplexNode n1(1);
	ComplexNode n2(2); 
	ComplexNode n3(3);
	ComplexNode n4(4);
	ComplexNode n5(5);
	n1._next = &n2;
	n2._next = &n3;
	n3._next = &n4;
	n4._next = &n5;


	n1._random = &n3;
	n2._random = &n1;
	n3._random = &n5;


	ComplexNode* node = Cope(&n1);
	while (node != NULL)
	{
		if (node->_random != NULL)
		cout <<"结点数据:" <_data << "random:" << node->_random->_data << endl;
		else
			cout << "结点数据:" << node->_data << "random:" << node->_random << endl;
		node = node->_next;
	}
}

测试结果:

剑指offer--复杂链表的复制_第2张图片




你可能感兴趣的:(剑指offer)