问题描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
解题思路:
使用hash_map容器按顺序存储每个节点,并生成一个新的节点,不过在加入hash_map前,要先判断节点是否已经存在容器中,已判断链表是否是循环链表。
同理,在遍历hash_map容器时,要用另一个容器set存储当前已存在的节点,若当前节点的next节点已在set容器中,那么我们可以判断此链表为循环链表,应该终止遍历了。
同时,还要注意random指针可能指向null,只有当random指针不指向null时,我们才能在hash_map中找到它对应指向的节点。
简单代码:
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if (pHead == NULL)
{ return NULL; }
unordered_map<RandomListNode*, RandomListNode*> hash_map;
set<RandomListNode*> set;
RandomListNode* p = pHead;
while (p!=NULL){
hash_map[p] = new RandomListNode(p->label);
if (hash_map.find(p->next)!=hash_map.end())
break;
p = p->next;
}
p = pHead;
while (p!=NULL) {
hash_map[p]->next = hash_map[p->next];
set.insert(p);
if (p->random!=NULL)
hash_map[p]->random = hash_map[p->random];
else
hash_map[p]->random = NULL;
if (set.find(p->next)!=set.end())
break;
p = p->next;
}
return hash_map[pHead];
}
};