You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

尝试删除链表第n个节点时触发NullPointerException错误求助

链表删除节点空指针异常排查与修复

问题描述

尝试删除链表中第n个位置的节点,预期输出应为531(删除第二个节点),但运行时报空指针异常,报错信息:

Exception in thread "main" java.lang.NullPointerException: Cannot read field "next" because "temp" is null
at DSA.Node.delete(Node.java:81)
at DSA.Node.main(Node.java:15)

原Java代码如下:

import java.util.*;
public class Node {
    int data;
    Node next;
    Node(int data)
    {
        this.data=data;
        next=null;
    }
    public static void main(String[] args) {
        Node obj=new Node(5);
        delete(obj,2);
       
    }
public static void delete(Node head,int n)
    {
        Node temp=head;
        Node ob1=new Node(4);
        head.next=ob1;
        Node ob2=new Node(3);
        ob1.next=ob2;
        Node ob3=new Node(1);
        ob3.next=null;
        
        int i ;
        //printing original linked list
        while(temp!=null)
        {
            System.out.print(temp.data);
            temp=temp.next;
        }
        
        //deleting
        for( i=1;i<n-1;i++)
        {

            temp=temp.next;
        }
        temp.next=temp.next.next;
        // printing new linked list
        
        while(temp!=null)
        {
            System.out.println(temp.data);
            temp=temp.next;
        }


    }
}

问题根源分析

  1. temp指针未重置:打印原链表的while循环结束后,temp已经走到链表末尾变为null,后续删除操作直接使用这个null指针,触发空指针异常。
  2. 链表构建不完整:代码中ob2.next没有指向ob3,导致原链表是5->4->3,缺少1节点,不符合预期的链表结构。
  3. 删除循环逻辑错误:当删除第2个节点时,n=2,循环条件i < n-1等价于i < 1,循环根本不会执行,此时temp还是null,执行temp.next必然报错。
  4. 删除后打印逻辑错误:删除操作后temp指向的是待删除节点的前一个节点,直接从temp开始打印会漏掉前面的节点,应该从头节点head开始遍历。

修正后的代码

import java.util.*;
public class Node {
    int data;
    Node next;
    Node(int data) {
        this.data = data;
        next = null;
    }

    public static void main(String[] args) {
        Node obj = new Node(5);
        delete(obj, 2);
    }

    public static void delete(Node head, int n) {
        // 构建完整链表:5->4->3->1
        Node ob1 = new Node(4);
        head.next = ob1;
        Node ob2 = new Node(3);
        ob1.next = ob2;
        Node ob3 = new Node(1);
        ob2.next = ob3; // 补上这一步,完成链表构建

        Node temp = head;
        // 打印原链表
        System.out.print("原链表:");
        while (temp != null) {
            System.out.print(temp.data);
            temp = temp.next;
        }
        System.out.println();

        // 重置temp到头部,准备删除操作
        temp = head;
        // 遍历到待删除节点的前一个节点(第n-1个节点)
        for (int i = 1; i < n - 1; i++) {
            if (temp != null) { // 增加空指针防护
                temp = temp.next;
            }
        }
        // 执行删除:跳过第n个节点
        if (temp != null && temp.next != null) { // 增加边界判断,避免空指针
            temp.next = temp.next.next;
        }

        // 从头部开始打印删除后的链表
        System.out.print("删除后链表:");
        temp = head;
        while (temp != null) {
            System.out.print(temp.data);
            temp = temp.next;
        }
    }
}

修正说明

  • 补全链表构建的最后一步ob2.next = ob3,确保链表结构为5->4->3->1。
  • 打印原链表后,将temp重置为head,避免使用null指针进行后续操作。
  • 删除操作前增加空指针判断,防止因链表长度不足导致的异常。
  • 删除后重新将temp指向head,从头开始打印完整的新链表。

内容的提问来源于stack exchange,提问作者Mohd. Tabish Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:53:24