每天一道算法题目(20)——复杂链表的拷贝
来源:互联网 发布:wind如何查询行业数据 编辑:程序博客网 时间:2024/06/10 03:02
题目:
输入复杂链表如图,复制该链表。
思路:
如图。传统的做法是先复制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
- 每天一道算法题目(20)——复杂链表的拷贝
- 每天一道算法题目——最大公约数
- 一道简单题目的复杂算法
- 每天一道算法题目(17)——二叉树的子结构
- 每天一道算法题——每天一道算法题
- 每天一道算法题(16)——翻转链表
- 每天一道算法题——链表反转
- 一道复杂的面试题目
- 每天一道算法题(16)——合并已排序的链表
- 每天一道算法题——合并两个排序的链表
- 每天一道算法题(22)——扑克牌的顺子
- 每天一道算法题——树的子结构
- 每天一道算法题——汉诺塔
- 每天一道算法题——
- 剑指offer——复杂链表的拷贝
- 每天一道算法题(8)——把二元查找树转变成排序的双向链表
- 每天一道算法题目(18)——取等长有序数组的上中位数和不等长有序数组的第k小的数
- 每天一道算法题15 含有指针成员的类的拷贝
- 内存数据库之ApacheDerby
- openproj jvm erron 193
- 使用LISTAGG函数合并行,使用xmltable获取xmlType数据
- UITextView加边框
- yfgxojyp
- 每天一道算法题目(20)——复杂链表的拷贝
- Objective-C NSFileManager 文件管理总结
- C++程序设计 - Week 7 文件操作和模板
- 黑马day14 踢人小案例
- 阿里云ODPS的愿景、技术实现与难点
- CentOS6.5中利用其自带的openjdk设置JAVA_HOME
- oracle 获取数据库中所有的表的注释,获取表的所有的列的注释
- 使用LR的ODBC协议进行mysql数据库测试
- MEAN框架学习笔记