【数据结构】[LeetCode138. 复制带随机指针的链表]

这篇具有很好参考价值的文章主要介绍了【数据结构】[LeetCode138. 复制带随机指针的链表]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.问题描述

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

OJ链接

二.思路分析

1.拷贝结点

首先拷贝结点,并且将拷贝的结点链接到被拷贝结点的后一个。

【数据结构】[LeetCode138. 复制带随机指针的链表]

 代码


struct Node 
{
    int val;
    struct Node *next;
    struct Node *random;
};

typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) 
{
    Node* cur = head;
    while(cur)
    {
        Node* tmp = (Node*)malloc(sizeof(Node));
        tmp->val = cur->val;
        tmp->next = cur->next;
        cur->next = tmp;

        //迭代
        cur = tmp->next;
    }
	

}

2.将random指向相应位置

当老结点random指向NULL时,新结点的random也指向NULL。
否则,将新结点的random指向老结点的random的下一个,即为新结点应指向的结点。

【数据结构】[LeetCode138. 复制带随机指针的链表]

【数据结构】[LeetCode138. 复制带随机指针的链表] 

代码 

    cur = head;
    while(cur)
    {
        if(cur->random == NULL)
        {
            cur->next->random = NULL;
        }
        else
        {
            cur->next->random = cur->random->next;
        }

        //迭代
        cur = cur->next->next;
    }

3.链接新链表,恢复原链表

将新malloc的结点尾插进入新链表,恢复原链表的链接关系

【数据结构】[LeetCode138. 复制带随机指针的链表]

代码

    //链接新链表,恢复原链表
    Node* NewListHead = NULL;
    Node* NewListTail = NULL;

    cur = head;
    while(cur)
    {
        Node* newnode = cur->next;
        Node* next = newnode->next;

        if(NewListHead == NULL)
        {
            NewListHead = NewListTail = newnode;
        }
        else
        {
            NewListTail->next = newnode;
            NewListTail = newnode;

            cur->next = next;
        }

        //迭代
        cur = next;
    }

    return NewListHead;

 三.完整代码

struct Node {
    int val;
    struct Node *next;
    struct Node *random;
};

typedef struct Node Node;
struct Node* copyRandomList(struct Node* head)
{
    Node* cur = head;
    //拷贝结点
    while (cur)
    {
        Node* tmp = (Node*)malloc(sizeof(Node));
        tmp->val = cur->val;
        tmp->next = cur->next;
        cur->next = tmp;

        //迭代
        cur = tmp->next;
    }

    //链接random
    cur = head;
    while (cur)
    {
        if (cur->random == NULL)
        {
            cur->next->random = NULL;
        }
        else
        {
            cur->next->random = cur->random->next;
        }

        //迭代
        cur = cur->next->next;
    }

    //链接新链表,恢复原链表
    Node* NewListHead = NULL;
    Node* NewListTail = NULL;

    cur = head;
    while (cur)
    {
        Node* newnode = cur->next;
        Node* next = newnode->next;

        if (NewListHead == NULL)
        {
            NewListHead = NewListTail = newnode;
        }
        else
        {
            NewListTail->next = newnode;
            NewListTail = newnode;

            cur->next = next;
        }

        //迭代
        cur = next;
    }

    return NewListHead;
}

四.提交结果

【数据结构】[LeetCode138. 复制带随机指针的链表]

 文章来源地址https://www.toymoban.com/news/detail-445370.html

到了这里,关于【数据结构】[LeetCode138. 复制带随机指针的链表]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode做题笔记138. 复制带随机指针的链表

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 

    2024年02月07日
    浏览(38)
  • 【数据结构OJ题】复制带随机指针的链表

    原题链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 此题可以分三步进行: 1. 拷贝链表的每一个结点,拷贝的结点先链接到被拷贝结点的后面。 2. 复制随机指针的链接:拷贝结点的随机指针指向被拷贝结点随机指针的下

    2024年02月12日
    浏览(61)
  • 【数据结构】两两交换链表 && 复制带随机指针的链表

    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 使用一个栈S来存储相邻两个节点即可 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以

    2024年04月15日
    浏览(47)
  • 138. 复制带随机指针的链表

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应

    2024年02月13日
    浏览(61)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(81)
  • 138. 复制带随机指针的链表(深拷贝)题解

    给你一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random  ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的  深拷贝 。 深拷贝应该正好由  n  个  全新  节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的  next  指针和

    2024年02月13日
    浏览(39)
  • 【LeetCode刷题日志】138.随机链表的复制

    🎈个人主页:库库的里昂  🎐C/C++领域新星创作者  🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:LeetCode 刷题日志 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 目录 1.题目描述 2.解题思路+代码实现 方法:迭代 + 节点拆分 思

    2024年02月04日
    浏览(37)
  • 力扣每日一道系列 --- LeetCode 138. 随机链表的复制

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 138. 随机链表的复制 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的

    2024年02月04日
    浏览(43)
  • 【刷题专栏—突破思维】LeetCode 138. 随机链表的复制

    前言 随机链表的复制涉及到复制一个链表,该链表不仅包含普通的next指针,还包含random指针,该指针指向链表中的任意节点或空节点。 题目链接: LeetCode 138. 随机链表的复制 题目介绍: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指

    2024年02月05日
    浏览(42)
  • 单链表OJ题:LeetCode--138.复制带随即指针的链表

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第138道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 : 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通  Lee

    2024年02月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包