尝试删除链表第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; } } }
问题根源分析
- temp指针未重置:打印原链表的while循环结束后,
temp已经走到链表末尾变为null,后续删除操作直接使用这个null指针,触发空指针异常。 - 链表构建不完整:代码中
ob2.next没有指向ob3,导致原链表是5->4->3,缺少1节点,不符合预期的链表结构。 - 删除循环逻辑错误:当删除第2个节点时,
n=2,循环条件i < n-1等价于i < 1,循环根本不会执行,此时temp还是null,执行temp.next必然报错。 - 删除后打印逻辑错误:删除操作后
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
相关产品推荐
相关产品推荐

