有的时候吧,代码越写不出来就越得等等,否则容易钻牛角尖。
这道题我用的最愚蠢的写法——哈希,灵感来自任意指针链表的哈希问题。
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
Node* cloneGraph(Node* node) {
if(nullptr==node)
return nullptr;
queue<Node*>bfs;
unordered_map<Node*, Node*>old2new;
bfs.push(node);
old2new.insert(pair<Node*, Node*>(node, new Node(node->val)));
while(!bfs.empty())
{
Node* pfrom = bfs.front();
for(auto pnextNodefrom : pfrom->neighbors)
{
if(old2new.find(pnextNodefrom)==old2new.end())
{
old2new.insert(pair<Node*, Node*>(pnextNodefrom, new Node(pnextNodefrom->val)));
bfs.push(pnextNodefrom);
}
}
bfs.pop();
}
unordered_set<Node*>usedNode;
bfs.push(node);
usedNode.insert(node);
while(!bfs.empty())
{
Node* pfrom = bfs.front();
for(auto pnextNodefrom : pfrom->neighbors)
{
if(usedNode.find(pnextNodefrom)==usedNode.end())
{
bfs.push(pnextNodefrom);
usedNode.insert(pnextNodefrom);
}
old2new.find(pfrom)->second->neighbors.push_back(old2new.find(pnextNodefrom)->second);
}
bfs.pop();
}
return old2new.find(node)->second;
}
};