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

leetcode刷题日记——随机链表的复制

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 题目要钱创建一个新的和给出链表相同的链表,val 和 next 的复制比较简单,关键在于 random 的复制
  • 先复制一个 random 不变的新链表,然后通过他在旧链表中的位置,去锁定新链表中 next 需要指向的位置
  • 运行如下
    在这里插入图片描述
struct Node* copyRandomList(struct Node* head) {if (!head) return NULL;struct Node* old_nodes[1000];struct Node* new_nodes[1000];int count = 0;struct Node* cur = head;struct Node* copy_head = NULL;struct Node* prev = NULL;while (cur) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));new_node->val = cur->val;new_node->next = NULL;new_node->random = cur->random;if (prev)prev->next = new_node;elsecopy_head = new_node;old_nodes[count] = cur;new_nodes[count] = new_node;count++;prev = new_node;cur = cur->next;}for (int i = 0; i < count; i++) {if (new_nodes[i]->random) {for (int j = 0; j < count; j++) {if (old_nodes[j] == new_nodes[i]->random) {new_nodes[i]->random = new_nodes[j];break;}}} else {new_nodes[i]->random = NULL;}}return copy_head;
}

[ 官方题解 ]:

  • 方法一:回溯 + 哈希表,用哈希表记录每一个节点对应新节点的创建情况。遍历该链表的过程中,检查「当前节点的后继节点」和「当前节点的随机指针指向的节点」的创建情况。如果这两个节点中的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。当拷贝完成,回溯到当前层时,即可完成当前节点的指针赋值。注意一个节点可能被多个其他节点指向,因此可能递归地多次尝试拷贝某个节点,为了防止重复拷贝,需要首先检查当前节点是否被拷贝过,如果已经拷贝过,可以直接从哈希表中取出拷贝后的节点的指针并返回即可
struct HashTable {struct Node *key, *val;UT_hash_handle hh;
} * cachedNode;struct Node* deepCopy(struct Node* head) {if (head == NULL) {return NULL;}struct HashTable* tmp;HASH_FIND_PTR(cachedNode, &head, tmp);if (tmp == NULL) {struct Node* headNew = malloc(sizeof(struct Node));headNew->val = head->val;tmp = malloc(sizeof(struct HashTable));tmp->key = head, tmp->val = headNew;HASH_ADD_PTR(cachedNode, key, tmp);headNew->next = deepCopy(head->next);headNew->random = deepCopy(head->random);}return tmp->val;
}struct Node* copyRandomList(struct Node* head) {cachedNode = NULL;return deepCopy(head);
}
http://www.xdnf.cn/news/4599.html

相关文章:

  • 应急响应靶场web3:知攻善防实验室
  • 使用英伟达 Riva 和 OpenAI 构建 AI 聊天机器人
  • 普通IT的股票交易成长史--20250507晚复盘
  • J2 WebScarab 安装指南详细步骤与配置方法
  • 数据报(Datagram)与虚电路(Virtual Circuit)的区别
  • SQL Server 存储过程开发三层结构规范
  • 生物化学笔记:神经生物学概论12 大脑全景图 知觉、行为和语言 注意力
  • vue3的页面跳转方法汇总(路由跳转,组件跳转)
  • 微信小程序开发,登录注册实现
  • ​​Dongle​​(中文常称“加密狗”或“适配器”)
  • 智慧医疗时代下的医疗设备智能控费系统解决方案
  • 【C++】C++中的类型转换
  • GoFrame框架下优雅使用Redis:从入门到实战的最佳实践
  • docker搭建DeepSeek+Dify构建个人知识库
  • 在 Ubuntu 系统中,挂起(Suspend)和休眠(Hibernate)
  • 如何做界面自动化工具选择?
  • 深入解析Spring Boot项目目录结构:从新手到规范实践
  • Git 撤销已commit但未push的文件
  • overflow使用
  • 力扣热题100之回文链表
  • Python学习之路(八)-多线程和多进程浅析
  • 《MySQL:MySQL索引特性》
  • 解锁 Postgres 扩展日!与瀚高共探 C/Java 跨语言扩展技术的边界与未来
  • si551x时钟芯片linux下调试总结
  • 基于 SpringBoot + Vue 的校园管理系统设计与实现
  • STM32的看门狗
  • English of Root for May 7th
  • 工程师转型算法工程师 深入浅出理解transformer-手搓板
  • zst-2001 历年真题 知识产权
  • 端口安全配置