Leetcode 133. 克隆图 c++

链接:
https://leetcode-cn.com/problems/clone-graph/

关键思路:
1.题目中明明确表示不会超过100个数据,所以用了一个数组
2.每个节点克隆分两步:new一个节点和克隆邻居的指针,两步都结束才算完成。
3.new节点的时候放到task列表中,克隆邻居指针的时候要到已有信息中找一下是否有这个节点。

class Solution {
public:
    // 新的节点与旧的邻居们一一对应
    struct CloneInfo {
        int success; // 是否完成克隆
        Node* newNode;  // 新的节点
    };

    Node* cloneGraph(Node* node)
    {
        if (node == nullptr) {
            return nullptr;
        }
        vector<CloneInfo> cloneInfo(101); // 克隆信息
        queue<Node*> task; // 任务表
        CloneInfo head = {
            0,
            CreateHead(node),
        };
        cloneInfo[head.newNode->val] = head;
        task.push(head.newNode);

        // 克隆整张表
        Clone(cloneInfo, task);

        return head.newNode;
    }

private:
    Node* CreateHead(Node* node)
    {
        Node* head = new Node;
        head->val = node->val;
        // 先用旧的邻居表
        head->neighbors = node->neighbors;
        return head;
    }

    void Clone(vector<CloneInfo> cloneInfo, queue<Node*>& task)
    {
        // 遍历任务表
        while (!task.empty()) {
            Node* node = task.front();

            // 克隆邻居们
            vector<Node*>& neighbor = node->neighbors;
            auto neighborSize = neighbor.size();
            for (size_t i = 0; i < neighborSize; i++) {
                if (cloneInfo[neighbor[i]->val].newNode == nullptr) {
                    Node* node = new Node;
                    node->val = neighbor[i]->val;
                    // 先用旧的邻居表
                    node->neighbors = neighbor[i]->neighbors;

                    CloneInfo info = {
                        0,
                        node,
                    };
                    cloneInfo[info.newNode->val] = info;
                    task.push(info.newNode);
                }
                node->neighbors[i] = cloneInfo[neighbor[i]->val].newNode;
            }

            cloneInfo[node->val].success = 1;
            task.pop();
        }
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容