Copy List with Random Pointer -leetcode
2016-04-01 13:43
495 查看
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
解题思路:
一般列表deep copy(不只是copy一个head,而是对每个node的创建复制) 只需创建节点并把value和*next赋值即可。但是这里的node 包含一个*random成员,他可以随意指向列表中的任何一个node或者NULL,需要将原列表中的*random对应到新的列表中。
我的思路:
1、先通过new创建一个新的head,取名为 result。
2、deep copy 原列表,不考虑成员: random
3、通过定义两个指针遍历 head和result。寻找某个成员random的方法:定义指针*p *q,他们从head和result同时移动,源列表中移动*random 项,则目的列表的也是对应成员的*random。
其他思路(更好):
1、 在每个节点后面插入一个新的节点,这个节点label,random是前一个节点的拷贝
2、将新节点的random = random->next;
3 、将新创建的节点按序组成一个链表
Return a deep copy of the list.
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */
解题思路:
一般列表deep copy(不只是copy一个head,而是对每个node的创建复制) 只需创建节点并把value和*next赋值即可。但是这里的node 包含一个*random成员,他可以随意指向列表中的任何一个node或者NULL,需要将原列表中的*random对应到新的列表中。
我的思路:
1、先通过new创建一个新的head,取名为 result。
2、deep copy 原列表,不考虑成员: random
3、通过定义两个指针遍历 head和result。寻找某个成员random的方法:定义指针*p *q,他们从head和result同时移动,源列表中移动*random 项,则目的列表的也是对应成员的*random。
class Solution { public: RandomListNode *copyRandomList(RandomListNode *head) { if(head==NULL) return NULL ; else { RandomListNode *temp =new RandomListNode (head->label) , *ptr,*result; ptr=head; result=temp; while(ptr->next!=NULL){ temp->next = new RandomListNode (ptr->next->label); ptr = ptr->next; temp= temp->next; } ptr=head; temp=result; while(ptr!=NULL) { if(ptr->random!=NULL) { RandomListNode *p=head , *q=result; while(p->next!=NULL) { if(p==ptr->random) { temp->random = q; break; } p = p->next; q = q->next; } temp->random = q; } ptr = ptr->next; temp= temp->next; } return result; } } };
其他思路(更好):
1、 在每个节点后面插入一个新的节点,这个节点label,random是前一个节点的拷贝
2、将新节点的random = random->next;
3 、将新创建的节点按序组成一个链表
class Solution { public: RandomListNode *copyRandomList(RandomListNode *head) { RandomListNode *tHead = head; RandomListNode *next = NULL; while(tHead) { next = tHead->next; RandomListNode *node = new RandomListNode(tHead->label); node->next = tHead->next; //node->random = tHead->random; tHead->next = node; tHead= next; } tHead = head; while(tHead) { if(tHead->random) tHead->next->random = tHead->random->next; tHead = tHead->next->next; } RandomListNode *retHead = NULL; RandomListNode *tRet = NULL; tHead = head; RandomListNode *next2 = NULL; while(tHead) { if(retHead == NULL) { next2 = tHead->next->next; retHead = tHead->next; tRet = retHead; tHead->next = next2; tHead = next2; } else { next2 = tHead->next->next; tRet->next = tHead->next; tHead->next = next2; tHead = next2; tRet = tRet->next; } } return retHead; } };
相关文章推荐
- Integrating Apache Spark with PyCharm
- linux上xls文件转db文件的方法
- 商品详情系统架构设计
- linux 动态链接器相关
- xampp集成环境配置自定义端口号虚拟主机,局域网访问apache菜鸟教程
- Linux日志清除
- 在Centos7上安装python3.5,以及与旧版本python2.7.5的共存问题
- uwsgi部署到nginx出现invalid request block size: 4161 (max 4096)...skip问题
- Linux _守护进程 浅解
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
- Linux中常用命令详解
- Linux _孤儿进程和僵尸进程 浅见
- ZedBoard Linux开发 --- GPIO驱动详解
- spark-TopK算法
- Linux vmstat命令实战详解
- [Linux应用]通过sysfs在用户空间使用GPIO
- 部署与管理ZooKeeper
- LinuxGPIO驱动使用其实很简单
- linux内核 GPIO口编程入门
- Linux 小技巧