这道题目使用map做,代码简洁高效。这里实现使用了一个“奇技淫巧”,姑且记下
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct UndirectedGraphNode {
int label;
vector<UndirectedGraphNode *> neighbors;
UndirectedGraphNode(int x) : label(x) {};
};
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node == NULL)return NULL;
vector<UndirectedGraphNode *> vecOld;
vector<UndirectedGraphNode *> vecNew;
queue<UndirectedGraphNode *> que;
UndirectedGraphNode *mark = new UndirectedGraphNode(0);
UndirectedGraphNode *oldNode = node;
oldNode->neighbors.push_back(mark);
oldNode->neighbors.push_back(new UndirectedGraphNode(vecOld.size()));
vecOld.push_back(oldNode);
que.push(oldNode);
//广度遍历将全部节点加入vector中,并对节点添加neighbors成员的方式标记其在vector中的位置
while(que.size() > 0)
{
for(auto iter = que.front()->neighbors.begin(); *iter != mark; iter++)
{
if(!((*iter)->neighbors.size()>1 && (*iter)->neighbors[(*iter)->neighbors.size()-2] == mark))
{
(*iter)->neighbors.push_back(mark);
(*iter)->neighbors.push_back(new UndirectedGraphNode(vecOld.size()));
vecOld.push_back(*iter);
que.push(*iter);
}
}
que.pop();
}
//添加元素
for(int i=0; i<vecOld.size(); i++)
{
vecNew.push_back(new UndirectedGraphNode(vecOld[i]->label));
}
//添加元素邻居
for(int i=0; i<vecOld.size(); i++)
{
for(auto iter = vecOld[i]->neighbors.begin(); *iter != mark; iter++)
{
vecNew[i]->neighbors.push_back(vecNew[((*iter)->neighbors[(*iter)->neighbors.size()-1])->label]);
}
}
//去除标记
for(int i=0; i<vecOld.size(); i++)
{
UndirectedGraphNode *tmp = vecOld[i]->neighbors.at(vecOld[i]->neighbors.size()-1);
vecOld[i]->neighbors.erase(--vecOld[i]->neighbors.end());
delete tmp;
vecOld[i]->neighbors.erase(--vecOld[i]->neighbors.end());
}
delete mark;
return vecNew[0];
}
};