单链表跳过M节点后删N节点的Java程序空指针异常排查
问题排查与修复方案
针对你遇到的单链表操作中出现的NullPointerException(NPE),结合报错位置(curr1.next = curr2;和main方法第127行),核心原因是操作null节点的引用,以下是具体排查点和修复方案:
核心问题分析
报错行curr1.next = curr2;触发NPE,只有两种可能:
curr1为null,此时尝试访问curr1.next直接抛出异常;- 虽然
curr1不为null,但逻辑在移动curr1或curr2时未判断边界,导致链表提前走到末尾后仍继续操作。
大型测试用例更容易触发这个问题,因为链表长度更长,更可能出现"跳过M个节点后已到链表末尾"或"删除N个节点时提前走到null"的场景。
修复后的方法实现
下面是修正后的deleteNNodesAfterEveryMNodes方法,添加了null边界判断,避免NPE:
public class SinglyLinkedList { private Node head; private class Node { int data; Node next; Node(int data) { this.data = data; this.next = null; } } public void deleteNNodesAfterEveryMNodes(int M, int N) { Node curr1 = head; // 循环处理整个链表 while (curr1 != null) { // 跳过M个节点:从当前节点开始,走M-1步到达第M个节点 for (int i = 1; i < M && curr1 != null; i++) { curr1 = curr1.next; } // 如果跳过M个后已到链表末尾,直接退出 if (curr1 == null) { break; } // 准备删除接下来的N个节点:找到N个节点后的第一个有效节点 Node curr2 = curr1; int deleteCount = 0; // 移动curr2,直到删够N个或走到链表末尾 while (deleteCount < N && curr2.next != null) { curr2 = curr2.next; deleteCount++; } // 连接跳过M后的节点与N个节点后的节点,完成删除 curr1.next = curr2.next; // 移动curr1到下一段的起点,继续循环 curr1 = curr1.next; } } // 示例main方法(对应你第127行的可能问题修复) public static void main(String[] args) { SinglyLinkedList list = new SinglyLinkedList(); // 假设这里是创建大型测试链表的逻辑 // ... list.deleteNNodesAfterEveryMNodes(2, 3); // 遍历打印链表时必须判断节点是否为null,避免NPE Node temp = list.head; while (temp != null) { System.out.print(temp.data + " "); temp = temp.next; } } }
关键修复点
跳过M个节点时的边界判断:
- 在循环移动
curr1时,每次都检查curr1 != null,避免走到链表末尾后仍继续移动; - 跳过M个节点后,立即判断
curr1是否为null,若为null则直接退出循环,不执行后续删除操作。
- 在循环移动
删除N个节点时的边界判断:
- 移动
curr2时,判断的是curr2.next != null,确保不会把curr2移动到null节点; - 即使链表剩余节点不足N个,也能安全删除剩余所有节点,不会触发NPE。
- 移动
main方法第127行的排查:
- 若该行是遍历打印链表的代码,必须添加
temp != null的判断(如示例中所示); - 若该行是调用
deleteNNodesAfterEveryMNodes后的链表操作,检查是否处理了链表头为null的情况(比如当整个链表被删除后,head会变为null)。
- 若该行是遍历打印链表的代码,必须添加
内容的提问来源于stack exchange,提问作者userUser
相关产品推荐
相关产品推荐

