当前位置: 代码网 > it编程>软件设计>算法 > 【刷题专栏—突破思维】LeetCode 138. 随机链表的复制

【刷题专栏—突破思维】LeetCode 138. 随机链表的复制

2024年08月02日 算法 我要评论
随机链表的复制涉及到复制一个链表,该链表不仅包含普通的next指针,还包含random指针,该指针指向链表中的任意节点或空节点。

在这里插入图片描述


文章目录


题目链接: leetcode 138. 随机链表的复制

原地修改链表

示例1:
在这里插入图片描述
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例2:
在这里插入图片描述
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]


在这里插入图片描述

  1. 第一次遍历:复制节点并插入到原节点后面
    • 对于每个原节点,创建一个新节点,并将新节点插入到原节点后面。
    • 新节点的val和next指针与原节点相同,而random指针初始化为null。

在这里插入图片描述

struct node* current = head;
while (current != null) {
    struct node* copy = (struct node*)malloc(sizeof(struct node));
    copy->val = current->val;
    copy->next = current->next;
    copy->random = null;
    current->next = copy;
    current = copy->next;
}
  1. 第二次遍历:更新复制节点的 random 指针

    • 对于每个原节点,如果其random指针不为null,则将对应的复制节点的random指针指向原节点的random指针的下一个节点。

在这里插入图片描述

current = head;
while (current != null) {
    if (current->random != null) {
        current->next->random = current->random->next;
    }
    current = current->next->next;
}
  1. 第三次遍历:拆分原链表和复制链表

    • 将链表拆分为原链表和复制链表,同时恢复原链表的next指针。

在这里插入图片描述

struct node* newhead = head->next;
struct node* newcurrent = newhead;
current = head;
while (current != null) {
    current->next = newcurrent->next;
    current = current->next;
    if (current != null) {
        newcurrent->next = current->next;
        newcurrent = newcurrent->next;
    }
}

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com