首页 > 编程语言 >随机链表的复制(java),注意NullPointerException

随机链表的复制(java),注意NullPointerException

时间:2024-12-05 21:59:44浏览次数:8  
标签:Node java temp random next 链表 null NullPointerException

题目描述:

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

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,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 h = new Node(head.val);
        Node p1 = head.next,p2=h;
        while(p1!=null){
            Node nod = new Node(p1.val);
            // nod.val=p1.val;
            p2.next=nod;
            p2=p2.next;
            p1=p1.next;
        }
        //    
        Node temp = head;
        Node temp2 = h;
        while(temp!=null){
            p1=head;
            p2=h;
            if(temp.random==null){
                temp2.random = null;
                 temp=temp.next;
                 temp2=temp2.next;
            }else{
               while(temp.random!=p1){
                p1=p1.next;
                p2=p2.next;
               }
            temp2.random = p2;   
            temp=temp.next;
            temp2=temp2.next;  
            }     
        }
        return h;
    }
}

查漏补缺:

原始的这段代码出错:

出现了以下错误
java.lang.NullPointerException: Cannot read field "random" because "<local5>" is null
  at line 35, Solution.copyRandomList
  at line 191, __DriverSolution__.__helper__
  at line 227, __Driver__.main

 while(temp.random!=null&&temp.random!=p1){
       p1=p1.next;
       p2=p2.next;
}      

原因分析:

NullPointerException 出现在访问 temp.random 时。这表明 temp 在某些情况下是 null,或者 temp.random 在访问时是 null

在这段代码中,如果 temp.randomnull,则 temp.random != p1 条件判断会导致空指针异常。因此需要在判断 temp.random != null 后再执行其他操作。这样可以防止尝试访问 null 时出现异常。

解决方法:

  1. 修复随机指针的处理逻辑: 在判断 temp.random != null 时,应该确保在访问 temp.random 之前进行空值判断。

标签:Node,java,temp,random,next,链表,null,NullPointerException
From: https://blog.csdn.net/qq_45452617/article/details/144277078

相关文章

  • JavaScript中todolist操作--待办事项的添加 删除 完成功能
    效果图在文本框中输入内容点击添加按钮会在下面生成添加功能html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><......
  • java实现树的遍历
    packagetree;importjava.util.*;publicclassBinaryTree{ publicTreeNoderoot; publicvoidinsert(intdate) { TreeNodenewNode=newTreeNode(date); if(root==null) { root=newNode; return; } TreeNodecurrentNode=root; while(true) {......
  • JavaScript定时器
    1.setInterval(functiontime)周期定时器vari=0setInterval(function(){console.log(i++)},3000)//3000指的是3000毫秒也就是3s//这个事件会每隔三秒显示一个i每次i++2.setTimeout延迟定时器setTimeout(function(){console.log(i++)},3000)//这个是打......
  • Java篇String类的常见方法
    目录1.创建字符串2.获取字符串长度3.字符串拼接4.字符串比较5.查找字符或子字符串6.字符串截取7.字符串替换8.字符串分割9.字符串转换10.字符串格式化11.字符串转字符数组12.检查字符串是否为空或空白13.字符串连接14.字符串的哈希值15.字符串的......
  • JavaScript核心语法(2)
    这篇文章属于是一点大杂烩。,因为我整理了一下JavaScript的一些语法,我发现有几个知识点是很散的,我原本想每个知识点都整理成一篇文章,但是后来发现没多少可写的,所以我就打算将这些大杂烩的知识点放到这里来。语句和表达式JavaScript程序是一行一行执行的。一般情况下,每一行就......
  • 【学习总结|DAY012】Javabean书写练习
    一、主要代码publicclassPhone{publicPhone(){}publicPhone(Stringbrand,intprice,Stringcolor){this.brand=brand;this.price=price;this.color=color;}Stringbrand;intprice;String......
  • HTML网页规划与设计【冬季奥林匹克运动会——带论文报告5200字】HTML+CSS+JavaScript
    ......
  • 【计算机毕业设计】基于HTML+CSS+JavaScript大学生心理咨询网设计毕业论文源码
    ......
  • java操作http请求针对不同提交方式(application/json和application/x-www-form-urlenc
    @目录摘要举例三种请求:依赖第一种:http的GET请求(application/json)第二种:http的POST请求(application/json)第三种:http的POST请求(application/x-www-form-urlencoded)摘要举例三种请求:http的GET请求(application/json)http的POST请求(application/json)http的POST请求(application/x......
  • 双向链表的介绍及相关的代码
    双向链表特性逻辑结构:线性结构存储结构:链式结构操作:增删改查代码结构体intlen=0;//定义一个全局变量,来保存长度typedefstructListNade{structListNade*prev;//头指针structListNade*next;//尾指针intdata;......