复杂单链表的复制

       在这里复杂单链表指的是一个具有_sibling结点指针的单链表,这个指针可以指向单链表中的任意一个结点,这就让复制的工作难以进行,当复制_sibling指针的时候需要从链表的头节点开始经过n步才能找到,所以复杂链表的这种复制方法的时间复杂度是O(N*N)。但是一般情况下O(N*N)的时间复杂度是面试官所不能认同的算法,所以我们需要找到比这种方法快的方法。

  复杂链表的结点结构:   

typedef int Datatype;
struct ComplexListNode
{
	Datatype data;
	ComplexListNode* p_next;//指向单链表的下一个节点
	ComplexListNode* p_random;//随机指向单链表中的一个节点
}


   

这是一个复杂的问题,我们要依次性解决一个复杂的问题显然是不可能的,我们可以把这个复杂的问题分步解决,各个击破,复杂的问题就成为了一个个简单的小问题,这就是这道面试题的思想。

    对于这道题,我们之前做过单链表的复制,但是在此处多了一个随机的指针,我们可以分为以下三步来完成:



第一步:复制整个链表,将复制出来的结点链接在对应节点的后面。

void CloneNode()
	{
		Node* cur = _head;
		while (cur)
		{
			Node* clone = new Node(cur->_data);
			clone->_next = cur->_next;
			clone->_random = NULL;
			cur->_next = clone;

			cur = cur->_next;
		}
	}

第二步:设置新结点的随机指针:

void CloneSiblingNode()
	{
		Node* cur = _head;
		while (cur)
		{
			Node* clone = cur->_next;
			clone->_random = clone->_random;
			cur = clone->_next;
		}
	}


第三步:长链表拆分成两个链表,一个是原链表,另外一个是已经复制好的当链表:

Node* ReconnectNode()
	{
		Node* cur = _head;
		Node* cloneHead = NULL;
		Node* cloneCur = NULL;
		while (cur)
		{
			cloneHead = cloneCur = cur->_next;
			cur->_next = cloneCur->_next;
			cur = cur->_next;
		}
		while (cur)
		{
			cloneCur->_next = cur->_next;
			cloneCur = cloneCur->_next;
			cur->_next = cloneCur->_next;
			cur = cur->_next;
		}
		return cloneHead;
	}


最后,我们把三步放进复杂单链表的复制逻辑中,就完成了:

	Node* Clone()
	{
		CloneNode();
		CloneSiblingNode();
		return ReconnectNode();
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值