关闭

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

标签: 复制复杂链表
552人阅读 评论(0) 收藏 举报
分类:

题目:

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




思路:

       如图。传统的做法是先复制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;
}




0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

每日一道算法题——1

求字符串字串的长度。
  • q1242027878
  • q1242027878
  • 2017-02-07 13:06
  • 520

java 复杂链表的复制

阿里终面在线编程题,写出来与大家分享一下有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空, 写一个深度拷贝函数,拷贝整个链表,包括random指针。尽可能考虑可能的异常情况。算法如下:/* public class RandomListNode { int...
  • diu_brother
  • diu_brother
  • 2016-03-26 21:22
  • 986

每天一道算法题(33)——阿里巴巴之魔方翻转

题目:     阿里巴巴2015秋招机试题目: 一个三阶魔方由六个面组成,颜色分别是白色(W)、对面为黄色(Y)、红色(R)、对面为橙色(O)、绿色(G)、对面为蓝色(B)。如果手持魔方,白色向上,红色朝向自己,则绿色在左手侧。 请写一个程序,对一个处于还原状态(各面各块同色)的...
  • qianhen123
  • qianhen123
  • 2015-08-23 20:26
  • 787

复杂链表的复制(C++)

题目:         输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可以为NULL) )。 要求实现一个算法返回一个链表,结构与输入的链表一致(完全的一份拷贝)。 注:  ...
  • u013575812
  • u013575812
  • 2015-12-04 21:15
  • 717

剑指Offer___关于复杂链表的复制算法剖析

本文的源代码和测试代码:https://github.com/clearoff/learngit/blob/master/ComplexLinklist.c 1、复杂链表的定义:       一般的,我们把只有一个数据于和一个指针的节点所组成的链表叫做单链表,由单链表我...
  • bit_clearoff
  • bit_clearoff
  • 2016-06-17 17:26
  • 439

算法题:复制复杂链表之复制连接法

上篇文章算法题:复制复杂链表之空间换时间法我们给出了用映射的方法来为新复制的链表中的每个结点设置any指针,本文给出的是《剑指offer》上给出的算法与代码,《剑指offer》上提到该算法的实现三个步骤: 第一步:复制原始链表的任意结点N并创建新结点N',在把N'连接到...
  • JXH_123
  • JXH_123
  • 2014-08-05 20:24
  • 729

复杂链表的复制 java

剑指offer题目 用java实现,ac通过 Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。 ...
  • samjustin1
  • samjustin1
  • 2016-07-15 20:41
  • 1257

链表相关的算法题大汇总 — 数据结构之链表奇思妙想

声明:转自http://hi.baidu.com/lanxuezaipiao/item/afc616caf8393a155050585b 基本函数 1,构造节点:  //定义节点类型 struct Node { int value; Node*next; };   2,分配节...
  • lanxuezaipiao
  • lanxuezaipiao
  • 2014-03-25 21:18
  • 2786

链表经典算法题实现

本文包含链表的以下内容:   1、单链表的创建和遍历   2、求单链表中节点的个数   3、查找单链表中的倒数第k个结点(剑指offer,题15)   4、查找单链表中的中间结点   5、合并两个有序的单链表,合并之后的链表依然有序【出现频率高】(剑指offer,题17)   6、单链表...
  • u012129558
  • u012129558
  • 2016-09-18 16:29
  • 850

每天一道算法题目——最大公约数

题目:求最大公约数 输入一组正整数(数量小于20),输出其最大公约数。 输入:121 33 44 11 1111 输出:11 基本思路: 先求前两个数的的最大公约数,再用这个公约数和第三个数求最大公约数,以此类推。。。。。。。。。。。 #include using nam...
  • yyf994
  • yyf994
  • 2016-06-02 09:03
  • 144
    个人资料
    • 访问:200856次
    • 积分:3768
    • 等级:
    • 排名:第9917名
    • 原创:174篇
    • 转载:44篇
    • 译文:3篇
    • 评论:14条
    博客专栏
    最新评论