当我们首先执行mp[node] =时,在下面的代码中意味着现在我们的节点指向一个空向量的节点,那么我们如何访问它的相邻节点在for(auto adj: current ->邻居){}。当我们执行mp[node] = first时,是否节点引用没有改变;问题→链接https://leetcode.com/problems/clone-graph/
/*
// 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:
unordered_map<Node* , Node*> mp;
Node* cloneGraph(Node* node) {
if(node == NULL)
{
return NULL;
}
Node* first = new Node(node -> val, {});
mp[node] = first;
queue<Node*> q;
q.push(node);
while(q.empty() == false)
{
Node* curr = q.front();
q.pop();
for(auto adj: curr -> neighbors)
{
if(mp.find(adj) == mp.end())
{
mp[adj] = new Node(adj -> val, {});
q.push(adj);
}
mp[curr] -> neighbors.push_back(mp[adj]);
}
}
return mp[node];
}
};
在c++中,类属性是由类构造函数自动构造的。因此,您不需要在构造函数中设置neighbors属性。
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
/** Construct with no neighbors
* @param[in] _val node value, defaults to 0
*/
Node(int _val = 0)
: val( _val )
{}
/** Construct with neighbors
* @param[in] _val node value
* @param[in] _neighbors
*/
Node(int _val, vector<Node*>& _neighbors)
: val( _val )
, neighbors( _neighbors )
{}
};
在你的代码中有
unordered_map<Node* , Node*> mp;
这看起来很奇怪!你能解释一下你要做什么吗?这似乎是一个键和值都相等的映射,这是不必要的。也许一套就能满足你的需要。