【Hot 100 刷题计划】 LeetCode 138. 随机链表的复制 | C++ 链表深拷贝题解
LeetCode 138. 随机链表的复制 | C 哈希表 DFS 深拷贝题解 题目描述题目级别中等给你一个长度为n的链表每个节点包含一个额外增加的随机指针random该指针可以指向链表中的任何节点或空节点。请你构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点。复制链表中的指针都不应指向原链表中的节点。返回复制链表的头节点。 解题思路哈希表 DFS 递归普通的链表复制只需要一路next走到底即可但这道题多了一个random指针。random指针可能指向当前节点前面的节点也可能指向后面的节点甚至可能指向自己。如果贸然去新建random指向的节点极其容易陷入死循环或者重复创建。为了解决这个问题我们可以借助哈希表Hash Map和深度优先搜索DFS1. 哈希表充当“备忘录”我们定义一个全局的unordered_mapNode*, Node* hash;。Key (键)原链表中的节点指针。Value (值)新拷贝出来的对应节点指针。作用是只要原链表中的某个节点已经被拷贝过了我们就把它存进字典。下次无论是next还是random指针再指向它时我们直接从字典里把已经建好的新节点拿出来用即可。2. DFS 递归构建终止条件如果碰到了空指针!head直接返回空。查表如果当前节点head已经在哈希表里了说明它已经被拷贝过直接返回哈希表里存的新节点hash[head]。创建与登记核心操作创建一个新节点dummy并且立刻把它存入哈希表中hash[head] dummy;。注意必须在递归它的next和random之前将它存入哈希表否则如果random指向自己就会陷入无限递归死循环递归组装递归调用函数分别构建新节点的next和random。 C 代码实现/* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node(int _val) { val _val; next NULL; random NULL; } }; */classSolution{public:// 记录 原节点 - 新节点 的映射关系unordered_mapNode*,Node*hash;Node*copyRandomList(Node*head){// 1. 判空if(!head)returnhead;// 2. 如果当前节点已经拷贝过直接返回新创建的对应节点if(hash.count(head))returnhash[head];// 3. 创建新节点Node*dummynewNode(head-val);// 4. 重点必须立刻将其加入哈希表防止处理 random 时死循环hash[head]dummy;// 5. 递归处理 next 和 random 指针dummy-nextcopyRandomList(head-next);dummy-randomcopyRandomList(head-random);// 6. 返回拷贝好的新节点returndummy;}};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2455235.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!