leetcode刷题——复制带随机指针的链表

news/2025/2/25 23:05:11

思维导图:

题目描述:

给你一个长度为 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 作为传入参数。

题目接口:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
    
	
}

 解题分析:

链表的深拷贝的意思就是在原链表的基础之上重新搞一个链表。这个链表与原链表一点关系都没有,但是这个链表却和原链表一模一样(链表的值和链表的值的指向相同)。

解题步骤:

1.复制原节点连接到原节点的后面。

2.将复制节点的random指针指向连接起来。

3.将原链表恢复并将复制链表尾插形成新链表。

解题代码:

struct Node* copyRandomList(struct Node* head) {
    //当原链表为NULL时直接返回NULL
    if(head == NULL)
    return NULL;

    //当链表不为NULL时便制造一个与原节点相同的节点连接到原链表后面
    struct Node* cur = head;
    //处理复制节点
    while(cur)
    {   //复制节点
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        //链接复制节点到原节点后面
        struct Node* next = cur->next;
        cur->next = copy;
        copy->next = next;
        //迭代
        cur = next;
    }
   //将拷贝链表的random链接上
   cur = head;
   struct Node* copy =cur->next;
   while(cur)
   {
       if(cur->random == NULL)
       {
           copy->random = NULL;
       }
       else
       {
           copy->random = cur->random->next;
       }
       cur = copy->next;
       if(cur)
       copy = cur->next;
   }
   
   //将原链表复原并拆下复制链表成为一个新链表
   cur = head;
   struct Node* copyhead = cur->next;
   copy = cur->next;
   struct Node* next = copy->next;
  while(next)
  {
      cur->next = next;
      copy->next = next->next;

      cur = next;
      copy = cur->next;
      next = copy->next;

  }
  cur->next = next;
  copy->next = next;

return copyhead;
	
}


http://www.niftyadmin.cn/n/3873747.html

相关文章

Java 在基于文件系统的 JNDI 和 JNDI+LDAP 协议应用实例

以前经常在诸如 weblogic, jboss, tomcat 服务器上配置 JNDI 服务,代码也很简单。但还没有用过 LDAP 服务器. LDAP 用层次(树) 结构存储数据。 要引用树中的项目,就需要列出树中的节点名称。从所要项目开始,一直向树顶…

函数指针以及typedef

1.简单的函数指针的应用 形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的…

django+bootstrap_5. Django 2.1.7 runserver启动直接报错 django.core.exceptions.Improper

在其他办公电脑创建的Django项目 2.2.1 版本都可以直接 runserver 启动服务正常。但是本地创建的项目,只要执行python3 manage.py runserver 就直接报错。错误详细日志F:\pythonProject\mysite>python3 manage.py runserverPerforming system checks...Unhandled…

【SDUT】2130 数据结构实验之数组一:矩阵转置

问题描述&#xff1a; 数组——矩阵的转置 给定一个m*n的矩阵(m,n<100)&#xff0c;求该矩阵的转置矩阵并输出。 输入&#xff1a; 输入包含多组测试数据&#xff0c;每组测试数据格式如下&#xff1a; 第一行包含两个数m&#xff0c;n 以下m行&#xff0c;每行n个数&#x…

打印整型的二进制格式

一共2个文件&#xff1a; PrintBinary.java --- 打印整形的二进制格式PrintBinaryTest.java --- 测试文件主要内容&#xff1a;打印整型的二进制格式主要功能&#xff1a; 1. void printBinaryNumber(int x) 打印整型的二进制格式文件1&#xff1a;PrintBinary.…

c++实现对[]和()的重载

前面说到&#xff0c;c的操作符重载是一项十分强大的功能&#xff0c;来看看对”[]”和”()”两个操作符的重载&#xff0c;这也是其强大的体现。 1. 重载中括号 ”[]”在c/c一般是实现取数组元素的值操作&#xff0c;”[]”内的数值为数组的下标&#xff0c;数组的下标为整数…

C++中的数组传递

一维数组的传递 void func(int *l){ } int main(){int l[3];func(l); }void func(int l[3]){} int main(){int l[3];func(l); }二维数组的传递&#xff1a; void func(int **l){ } int main(){int l[3][4];func(l); }void func(int l[3][4]){ } int main(){int l[3][4];func(…

redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

点击蓝色“架构文摘”关注我哟加个“星标”&#xff0c;每天上午 09:25&#xff0c;干货推送&#xff01;来源&#xff1a;爱码士人员 简书&#xff1a;https://www.jianshu.com/p/f76c9767f6fd前言:在实际的开发项目中&#xff0c;一个对外暴露的接口往往会面临&#xff0c;…