当前位置: 首页 > article >正文

【C++习题】22.随机链表的复制

文章目录

    • 题目:138. 随机链表的复制 - 力扣(LeetCode)
    • 代码:


题目:138. 随机链表的复制 - 力扣(LeetCode)

链接🔗:138. 随机链表的复制 - 力扣(LeetCode)

题目:

c4e4a80bbcabab015f3ab1d3910b0199


代码:

class Solution {
public:
    // 函数功能:深拷贝带随机指针的链表
    // 参数:原链表的头节点指针
    // 返回值:拷贝后的新链表的头节点指针
    Node* copyRandomList(Node* head) {
        // 创建map用于存储原节点到拷贝节点的映射关系
        // key: 原链表节点地址
        // value: 对应的拷贝节点地址
        map<Node*, Node*> nodeMap;
        
        // copyhead指向拷贝链表的头节点
        // copytail指向拷贝链表的尾节点
        Node* copyhead = nullptr, *copytail = nullptr;
        
        // 第一次遍历:复制节点值和next指针
        Node* cur = head;
        while(cur)
        {
            // 如果是第一个节点
            if(copytail == nullptr)
            {
                // 创建头节点
                copyhead = copytail = new Node(cur->val);
            }
            else
            {
                // 创建新节点并连接到尾部
                copytail->next = new Node(cur->val);
                copytail = copytail->next;
            }

            // 建立原节点和拷贝节点的映射关系
            nodeMap[cur] = copytail;
            
            // 继续处理下一个节点
            cur = cur->next;
        }

        // 第二次遍历:处理random指针
        cur = head;          // cur指向原链表
        Node* copy = copyhead;  // copy指向拷贝链表
        while(cur)
        {
            // 如果原节点的random为空
            if(cur->random == nullptr)
            {
                copy->random = nullptr;
            }
            else
            {
                // 通过map找到原节点random指向的节点对应的拷贝节点
                copy->random = nodeMap[cur->random];
            }
            
            // 继续处理下一个节点
            cur = cur->next;
            copy = copy->next;
        }

        return copyhead;
    }
};

算法思路解析:

  1. 整体思路:
    • 分两次遍历完成深拷贝
    • 第一次遍历复制节点值和next指针,同时建立映射关系
    • 第二次遍历处理random指针
  2. 具体步骤:
    • 第一次遍历:
      • 复制每个节点的值
      • 建立next连接
      • 将原节点和对应的拷贝节点存入map
    • 第二次遍历:
      • 根据原节点的random指向
      • 通过map找到对应的拷贝节点
      • 建立random连接
  3. 时间复杂度:
    • O(N),需要两次遍历链表
    • map的插入和查找操作是O(logN)
  4. 空间复杂度:
    • O(N),需要额外的map存储映射关系

http://www.kler.cn/a/500688.html

相关文章:

  • Mysql常见知识点
  • Gitlab-Runner配置
  • 极品飞车6里的赛道简介
  • strace、ltrace、ftrace 和 dtrace
  • 离线录制激光雷达数据进行建图
  • 【AJAX详解】
  • 1-1 电场基本概念
  • Kafka 会丢消息吗?
  • 【赵渝强老师】什么是NoSQL数据库?
  • Redis是单线程还是多线程?
  • 反向代理模块。
  • 通过LlaMA-Factory导出的模型部署到Ollama
  • MySQL的增删改查(基础)-下篇
  • 利用 Java 爬虫获取淘宝商品详情 API 接口
  • spark汇总
  • Springboot3.4整合jsp
  • 通信与网络安全之网络连接
  • 【pycharm发现找不到python打包工具,且无法下载】
  • nginx反向代理及负载均衡
  • EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施
  • 保证Mysql数据库到ES的数据一致性的解决方案
  • SpringMVC根据url校验权限,防止垂直越权
  • Leetcode 3418. Maximum Amount of Money Robot Can Earn
  • 23_Spring Boot中Redis缓存实现
  • web服务器快速目录搜索遍历工具推荐:Dirsearch