当前位置: 首页 > article >正文

Leetcode138. 复制带随机指针的链表

复制带随机指针的链表

第一步 拷贝节点链接在原节点的后面
第二步拷贝原节点的random , 拷贝节点的 random 在原节点 random 的 next
第三步 将拷贝的节点尾插到一个新链表 ,并且将原链表恢复

从前往后遍历链表 ,将原链表的每个节点进行复制,并l链接到原节点的后面
malloc 一个节点copy

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

cur 往后走 ,不能写成cur =cur->next ,因为已经改变了链接关系,找不到cur的下一个节点的地址了

第一步的代码

struct Node* copyRandomList(struct Node* head)
 {
	 struct Node * cur = head ;
     //cur 走到NULL 结束 
     while(cur)
     {
         struct Node * copy = ( struct Node *)malloc ( sizeof( stuct Node)); 
         //拷贝
         copy->val = cur->val;

         struct Node *  next = cur->next ;
         // 改变链接关系  cur copy next  
         cur->next =copy ;
         copy->next = next ;
         //cur 往后走  ,不能写成cur =cur->next ,因为已经改变了链接关系,找不到cur的下一个节点的地址了 
         cur = next ;

     }
}

对原链表 random 指针的复刻 , 即原节点 的 random 拷贝到 拷贝节点 的 random 里面

在这里插入图片描述

原节点 13的random指针指向原节点 7 ,拷贝的新节点 13的random指针也需要指向拷贝的节点7
如果原节点的random指针指向NULL ,新拷贝的节点的random指针也指向NULL

第二步的代码


       //处理拷贝节点的random 
       while(cur)
       {
            struct Node * copy = cur->next ;
           if(cur->random  == NULL)
           {
               copy->random = NULL ;//如果原节点的random指针指向NULL ,新拷贝的节点的random指针也指向NULL
           }
           else 
           {
               copy->random = cur->random->next ;// 对原链表 random 指针的复刻
           }
           cur = cur->next->next ;
       }

在这里插入图片描述

上图中,我们可以观察到原节点 13的random指针指向原节点 7,拷贝的新节点13的random指针指向的是原节点7的next

推广一下也就是说
原节点 i 的random指针,指向的是原节点 j
那么新拷贝的节点 的random指针,指向的是原节点 j 的 next

但是这样下来 已经破坏了原链表 ,所以下一步是将拷贝的节点尾插到一个新链表 ,并且将原链表恢复

尾插
在这里插入图片描述

恢复原链表
在这里插入图片描述
在这里插入图片描述
第三步代码

    //将拷贝的新节点尾插到一个新链表, 并恢复原链表
          cur =head ;
       
        struct Node * copyhead  = NULL , * copyTail = NULL ;
       while( cur)
       {   
              struct Node *   copy =cur->next ;
          struct Node * next = copy->next ; 
                    //尾插
                if( copyhead ==NULL)
                {
                    copyhead = copyTail = copy ;
                }
                else
                {
                    copyTail->next = copy ;
                    copyTail = copyTail->next ;
                }
                //恢复原链表
                cur->next = next ;
                cur = next ;
       }

完整代码

struct Node* copyRandomList(struct Node* head)
 {
	 struct Node * cur = head ;
     //cur 走到NULL 结束 
     while(cur)
     {
         struct Node * copy = ( struct Node *)malloc ( sizeof( struct Node)); 
         //拷贝
         copy->val = cur->val;

         struct Node *  next = cur->next ;
         // 改变链接关系  cur copy next  
         cur->next =copy ;
         copy->next = next ;
         //cur 往后走  ,不能写成cur =cur->next ,因为已经改变了链接关系,找不到cur的下一个节点的地址了 
         cur = next ;

     }
       cur = head ;
       
       //处理拷贝节点的random 
       while(cur)
       {
            struct Node * copy = cur->next ;
           if(cur->random  == NULL)
           {
               copy->random = NULL ;
           }
           else 
           {
               copy->random = cur->random->next ;//
           }
           cur = cur->next->next ;
       }
       //将拷贝的新节点尾插到一个新链表, 并恢复原链表
          cur =head ;
       
        struct Node * copyhead  = NULL , * copyTail = NULL ;
       while( cur)
       {   
              struct Node *   copy =cur->next ;
          struct Node * next = copy->next ; 
                    //尾插
                if( copyhead ==NULL)
                {
                    copyhead = copyTail = copy ;
                }
                else
                {
                    copyTail->next = copy ;
                    copyTail = copyTail->next ;
                }
                //恢复原链表
                cur->next = next ;
                cur = next ;
       }
   return  copyhead ;
   
}

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!


http://www.kler.cn/a/1214.html

相关文章:

  • Knowledge Editing through Chain-of-Thought
  • windows及linux 安装 Yarn 4.x 版本
  • 计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法
  • fastGpt 本地运行 mongo, 要加 directConnection=true 参数
  • 【简博士统计学习方法】第1章:2. 统计学习方法的基本分类
  • WEB前端-2
  • 【十二天学java】day01-Java基础语法
  • HTTP报文数据检测与分类方案总结
  • 有趣且重要的JS知识合集(18)浏览器实现前端录音功能
  • Java中的二叉树
  • 【算法基础】二分图(染色法 匈牙利算法)
  • 【C语言进阶:刨根究底字符串函数】 strcmp 函数
  • 5、设备管理
  • SDIO读写SD卡速度有多快?
  • 「解析」牛客网-华为机考企业真题 1-20
  • 基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结
  • Ae:混合模式
  • HttpRunner3.x(1)-框架介绍
  • 蓝桥冲刺31天之317
  • 卷积神经网络CNN识别MNIST数据集
  • Navicat轻松操控MySQL数据库:从基础到高级操作全解析!
  • 2023年全国最新道路运输从业人员精选真题及答案26
  • 基于 pytorch 的手写 transformer + tokenizer
  • 重新学习Vue,了解一下Vue的故事和核心特点
  • 深度学习11. CNN经典网络 LeNet-5实现CIFAR-10
  • STL总结