首页 > 其他分享 >【Leetcode Top 100】138. 随机链表的复制

【Leetcode Top 100】138. 随机链表的复制

时间:2024-12-04 11:34:00浏览次数:4  
标签:Node cur Top random next 链表 100 节点

问题背景

给你一个长度为 n n n 的链表,每个节点包含一个额外增加的随机指针 r a n d o m random random,该指针可以指向链表中的任何节点或空节。
构造这个链表的 深拷贝。 深拷贝应该正好由 n n n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 n e x t next next 指针和 r a n d o m random random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点
例如,如果原链表中有 X X X 和 Y Y Y 两个节点,其中 X . r a n d o m = Y X.random = Y X.random=Y。那么在复制链表中对应的两个节点 x x x 和 y y y,同样有 x . r a n d o m = y x.random = y x.random=y。
返回复制链表的头节点。

数据约束

  • 0 ≤ n ≤ 1000 0 \le n \le 1000 0≤n≤1000
  • − 1 0 4 ≤ N o d e . v a l ≤ 1 0 4 -10 ^ 4 \le Node.val \le 10 ^ 4 −104≤Node.val≤104
  • N o d e . r a n d o m Node.random Node.random 为 n u l l null null 或指向链表中的节点。

解题过程

经典链表操作题,解决的关键在于能否想到把新建的复制节点添加到原节点的后一个。
通过上述方案复制完整个链表之后,只要能够分离链表即可,参考 奇偶链表,本题中由于原链表的后一个节点是它本身的复制,一定存在,分离的时候可以少一个判断。

注意数据范围,头节点可能为空,要单独处理。

具体实现

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

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    public Node copyRandomList(Node head) {
        // 特判头节点为空的情形
        if(head == null) {
            return null;
        }
        // 在原链表的每个节点之后新建复制节点
        Node cur = head, next;
        while(cur != null) {
            next = cur.next;
            cur.next = new Node(cur.val, cur.next); // 题中没说明这个构造器,实际上是存在的
            cur.next.next = next;
            cur = cur.next.next;
        }
        // 重置工作指针
        cur = head;
        // 给每个新节点的随机域赋值
        while(cur != null) {
            if(cur.random != null) {
                cur.next.random = cur.random.next;
            }
            cur = cur.next.next;
        }
        // 分离原链表和复制之后的链表
        Node copyHead = head.next, copy;
        cur = head;
        while(cur.next.next != null) {
            copy = cur.next; // 记录下一个节点
            cur.next = cur.next.next; // 调整原链表的 next 指针
            copy.next = copy.next.next; // 调整新链表的 next 指针
            cur = cur.next; // 后移工作指针
        }
        // 原链表的最后一个节点要指空
        cur.next = null;
        return copyHead;
    }
}

标签:Node,cur,Top,random,next,链表,100,节点
From: https://blog.csdn.net/2401_88859777/article/details/144233572

相关文章

  • 使用js生成1-10000的数组
    //Method1:Usingaforloop(mostcommonandgenerallyefficient)functiongenerateArray1(){constarr=[];for(leti=1;i<=10000;i++){arr.push(i);}returnarr;}//Method2:UsingArray.from()andkeys()(moreconcise)funct......
  • 25.100ASK_T113-PRO 测试摄像头(型号)
    1.摄像头USB2.0摄像头,支持 UVC协议, 就是V4L2+USB2.0 大概可这样理解吧.这个是2K分辨率.2.8mm焦距.开发板还是 100ASK_T113-PRO V1.2版2.查看摄像头驱动挂载情况这样接好.看看设备有没有挂载上#ls/dev/video*/dev/video0/dev/video1这两个就是USB摄像......
  • 【力扣热题100】—— Day3.反转链表
    你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了                                                                                        —— 24.12.2206.反转链表......
  • hot100-一刷-04子串(共3道题)
    560.和为K的子数组题目链接题目描述代码实现分析:暴力:还是有点技巧的,如果单纯暴力,外层fori循环遍历起始下标start,内层forj循环遍历末尾end,里面还需要个循环,计算从i加到j,最坏会到\(O(n^3)\)。考虑固定某一个边界,比如固定end,从end往前算。点击查看代码classSolution......
  • 链表操作
    [Algo]链表操作链表节点类型定义structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};1.反转链表//1.反转链表ListNode*reverseList(ListNode*head){ListNode*pre=nullptr,*next=nullptr;while(......
  • 使用 TOPIAM 轻松搞定「KubeSphere」单点登录
    本文将介绍 TOPIAM 与 KubeSphere 集成步骤详细指南。应用简介KubeSphere是在Kubernetes之上构建的以应用为中心的多租户容器平台,提供全栈的IT自动化运维的能力,简化企业的DevOps工作流。KubeSphere提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能......
  • 牛客---HJ48 从单向链表中删除指定值的节点(用ArrayList模拟链表,因为方便查找操作)
    示例代码importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);......
  • hot100-一刷-03滑动窗口(共2道题)
    3.无重复字符的最长子串题目链接题目描述代码实现分析:因为是要连续的序列,使用滑动窗口+Set集合来判断即将要加入窗口右端的元素是已经在窗口中出现过。代码:classSolution{publicintlengthOfLongestSubstring(Strings){intans=0;//Set......
  • 【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
    文章目录一、堆排引入之使用堆排序数组二、真正的堆排1.向上调整算法建堆2.向下调整算法建堆3.向上和向下调整算法建堆时间复杂度比较4.建堆后的排序4.堆排序和冒泡排序时间复杂度以及性能比较三、Top-K问题一、堆排引入之使用堆排序数组   在了解真正的堆排之......
  • 【文末赠票】和网易伏羲共探100个值得深入学习的技术创新案例
    在人工智能技术的浪潮中,AIAgent正成为推动游戏行业创新的关键力量。随着LLM的不断发展,Agent不管是在游戏设计、玩家体验,还是在NPC行为模拟等方面都展示了巨大的潜力。《永劫无间》手游近期发布的多模态实时交互的语音AI队友就是一次重大突破。传统机器人队友常常因招式木......