标签:struct ffffff next 遍历 shadow strong 技术 include 怎么
这是一道算法题。想写篇blog记录一下这道题的解法。cur = pHead;
while(cur != NULL){
map.insert(pair<RanomListNode*, RandomListNode*>(cur, new RandomListNode(cur->value));
cur = cur->next;
}
这只是一个代码片段,里面出现的东西,下面会有完整介绍。
此时,我在map中已经存有和现有链表一样多的节点了,并且节点值也是一样的。只是,我们还没有设置map中节点的next指针和random指针,换言之,这时map中的所有节点是断开的。
如下图:
很明显,我们知道接下来要做什么。就是将这些节点按照题目给出的链表模样串起来。
其次,将拷贝节点按照原链表连接好它们的next指针和random指针。
那么怎么串呢?我们看一下上面两张图,1的next指针连的是2,因此我们的拷贝节点1‘就得连2‘。也就是说,我们需要通过map去找到节点1的拷贝节点1‘,然后通过map去找到1的下一个节点的拷贝节点2‘。这不是很好理解,通过代码展示什么意思:
myMap[cur]->next = myMap[cur->next];
根据代码来看,我们通过myMap[cur]找到cur的拷贝节点,这个拷贝节点的next指针指向了cur节点下一个节点的拷贝节点。这样,就把两个拷贝节点连接起来了。
random指针同理设置。
代码如下:
myMap[cur]->random = myMap[cur->random];
最后一步,返回拷贝链表的头节点。因为,此时拷贝节点都串起来了,形成了完整的链表,只要返回链表头部,就能得到整个拷贝链表了。到此,所有步骤就已经结束了。
下面是完整代码:
#include <iostream>
#include <map>
using namespace std;
struct RandomListNode{
int value;
Node* next;
Node* random;
Node(int value) : value(value), next(NULL), random(NULL){
}
};
class CopyListWithRandom {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead == NULL)
return NULL;
map<RandomListNode*, RandomListNode*> myMap;
RandomListNode* cur = pHead;
while(cur != NULL){
myMap.insert(pair<RandomListNode*, RandomListNode*>(cur, new RandomListNode(cur->value)));
cur = cur->next;
}
cur = pHead;
while(cur != NULL){
myMap[cur]->next = myMap[cur->next];
myMap[cur]->random = myMap[cur->random];
cur = cur->next;
}
return myMap[pHead];
}
};
运行结果:
测试代码就自己写一下吧,比较简单。这种写法的关键是要掌握map的使用,别的也没有什么了。
至于不用额外空间的写法,那就更逆天了,下次再写吧,哈哈~
感谢各位大佬的阅读。欢迎评论,欢迎点赞~
================================================================================================================
如果可以的话,打个赏也行啊,哈哈~
一毛两毛也表示万分感谢,哈哈~
下面是我的支付宝及微信二维码
标签:struct ffffff next 遍历 shadow strong 技术 include 怎么
原文地址:http://blog.51cto.com/chen0547/2288050