攻城狮凌风

Talk is cheap, show me the code!

每天一道算法题目(20)——复杂链表的拷贝

题目:

     输入复杂链表如图,复制该链表。




思路:

       如图。传统的做法是先复制next指针部分,然后对于每个节点的random部分,则需要遍历整个链表查找对应节点。时间复杂度为O(n.^2)。时间这里总结一种时间复杂度为O(n)空间复杂度为O(1)的方法。

       第一步。简单复制next指针部分,并将拷贝节点和源节点链接一起。结果如下图:

       第二步。遍历链表,遇到random指针非空的,则其对应拷贝节点,也就是他的下一节点的random应该指向当前节点random指向的下一节点。例如A指向C,则A*必然指向C*,以此类推。

       第三步。拆分节点,偶数节点串接为拷贝链表,奇数节点串接为原链表。



代码:

typedef struct Tree{
	Tree* next;
	Tree* random;
}* node;

node copy(node head){
	if(!head)
		return NULL;

	//复制链表
	node temp=head;
	node copyNode=NULL;
	while(temp){
		copyNode=new Tree();
		copyNode->next=temp->next;
		temp->next=copyNode;
		temp=copyNode->next;
	}

	//复制随机指针
	temp=head;
	while(temp){
		if(!temp->random)
			temp->next->random=temp->random->next;
		temp=temp->next->next;
	}

	//将偶数链表拆分出来连接到一起即为链表的拷贝,当然应该将奇数部分重新整理还原
	temp=head;
	node copyHead=NULL;
	copyNode=copyHead=temp->next;
	temp->next=copyNode->next;
	temp=temp->next;
	while(temp){
		copyNode->next=temp->next;
		copyNode=copyNode->next;
		temp->next=copyNode->next;
		temp=temp->next;
	}
	return copyHead;
}




阅读更多
版权声明:本文为博主原创文章,转载请注明出处。任何基于商业利益的传播均需事先征得本人许可。 https://blog.csdn.net/qianhen123/article/details/46790343
文章标签: 复制 复杂链表
个人分类: 工作之笔试
所属专栏: 每天一道算法题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

每天一道算法题目(20)——复杂链表的拷贝

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭