复制带随机指针的链表
2015-07-16 15:58
393 查看
一个单链表除了next指针外,还带有一个随机指针(设为rand)指向任意元素,用最少的时间复杂度和最少的空间复制该链表。
可以用O(n)的时间复杂度和O(1)的附加空间实现:
1.根据源链表依次复制出新链表的对应节点,并将新节点插入到源节点后,新链表的random指针指向原链表的random;
2.然后遍历一遍链表,将新链表节点的random指针指向对应元素的next元素(即新链表中对应的random指针元素);
3.最后将新链表和源链表分离。
代码如下:
可以用O(n)的时间复杂度和O(1)的附加空间实现:
1.根据源链表依次复制出新链表的对应节点,并将新节点插入到源节点后,新链表的random指针指向原链表的random;
2.然后遍历一遍链表,将新链表节点的random指针指向对应元素的next元素(即新链表中对应的random指针元素);
3.最后将新链表和源链表分离。
代码如下:
RandomListNode *copyRandomList(RandomListNode *head) { // write your code here RandomListNode *p = head; RandomListNode *dest, *t = NULL; while (p != NULL) { t = new RandomListNode(p->label); t->next = p->next; t->random = p->random; p->next = t; p = t->next; //取得源链表中的下一个结点 } p = head; while (p != NULL) { t = p->next; if (t->random != NULL) { // 此处需要判断源节点的random是否为空,如果不为空才需要更新 t->random = t->random->next; } p = t->next; } p = head; dest = p->next; while (p != NULL) { t = p->next; p->next = t->next; //新旧链表分离的旧(源)链表 p = t->next; if (p != NULL) { t->next = p->next; //新旧链表分离的新链表 } } return dest; }
相关文章推荐
- Memcached客户端utils类
- 通过 FileResult 向 浏览器 发送文件
- Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
- poj 3842 全排列+筛素数+暴力
- Swift面向对象基础(中)——Swift中的方法
- Java 自动装箱与拆箱详解
- Android框架之快速开发框架xUtil
- 读取socket传过来的信息
- js 图片懒加载
- AVL树的插入与删除---Java实现
- win8 64bit/win7 32bit/winxp 32bit +QT+opencv环境配置教程,亲测成功
- 关于数组去重
- 实现jqgrid表格数据上下滚动
- ImageView设置图片的优化
- Android 中一些常用而又容易忘记的
- sqlServer 存储过程编写和调用
- pl/sql developer 连接oracle 11g数据库错误代码ora12557解决办法
- iOS错误报告中关于崩溃地址的分析
- Android 开发相关的Blog推荐——跟随大神的脚步才能成长为大神
- ABAP常用事物码