力扣-138.随机链表的复制
题目描述
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
class Solution {
public:Node *copyRandomList(Node *head) {if (head == NULL) {return head;}//复制各节点,并构建拼接链表,形如7->7->3->3->...Node *cur = head;while (cur) {Node *tmp = new Node(cur->val);tmp->next = cur->next;cur->next = tmp;cur = cur->next->next;}//构建各新节点的 random 指向cur = head;while (cur) {if (cur->random != NULL)//条件不要忘记cur->next->random = cur->random->next;//这行理解了关键逻辑就理解了cur = cur->next->next;}//拆分两链表cur = head->next;Node *pre = head;Node *res = cur;while (cur->next) {pre->next = cur->next;cur->next = cur->next->next;pre = pre->next;cur = cur->next;}pre->next = nullptr; // 单独处理原链表尾节点,因为不能修改原链表,否则报错return res;}
};
小结:没做过基本想不到这么巧妙的方法,只能寄希望于下次刷到可以顺利做出来,也是看了题解才勉强完成。主要思路是拼接+拆分,需要注意的点都写在注释里,还有一种哈希表解法没有看,从现在开始想用Java同步二刷hot100,我会新建一个专栏,欢迎关注阅读。