您的位置:首页 > 运维架构

[算法分析与设计] leetcode 每周一题: Copy List with Random Pointer

2017-10-27 15:26 411 查看
题目链接:https://leetcode.com/problems/copy-list-with-random-pointer/description/

题目大意: 深度复制一个给定的链表,只是该链表节点有个成员会指向该链表的随机位置

思路:

         这道题关键在于 如何 同构 随机节点和本节点关系,一开始我是打算直接开个vector存储链表本节点的index和随机节点的index,这样就可以简单粗暴获得两者的联系。然而在本题超时。然后我看了其他博客,发现可以用map来同构新链表和旧链表的关系。大概就是维护一个map,该map的key是旧链表的节点指针指针,value是新链表的节点,这样通过查询key的random就会返回一个新旧链表随机节点指针的复合体,就可以得到新节点的随机节点,代码如下:

/**
* 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) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == nullptr) return nullptr;
map<RandomListNode *, RandomListNode *> hash;
hash.insert(pair<RandomListNode *, RandomListNode *>(NULL, NULL));
RandomListNode * copyHead = new RandomListNode(head->label);
RandomListNode * subHead = head;
RandomListNode * tmp = copyHead;

while(subHead) {
hash.insert(pair<RandomListNode*, RandomListNode *>(subHead, tmp));
subHead = subHead->next;

if(subHead) {
tmp->next = new RandomListNode(subHead->label);
tmp = tmp->next;
}
}

tmp = copyHead;
subHead = head;

while(tmp) {
tmp->random = hash[subHead->random];
tmp = tmp->next;
subHead = subHead->next;
}
return copyHead;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: