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

单链表跳过M节点后删N节点的Java程序空指针异常排查

问题排查与修复方案

针对你遇到的单链表操作中出现的NullPointerException(NPE),结合报错位置(curr1.next = curr2;和main方法第127行),核心原因是操作null节点的引用,以下是具体排查点和修复方案:

核心问题分析

报错行curr1.next = curr2;触发NPE,只有两种可能:

  1. curr1为null,此时尝试访问curr1.next直接抛出异常;
  2. 虽然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;
        }
    }
}

关键修复点

  1. 跳过M个节点时的边界判断:

    • 在循环移动curr1时,每次都检查curr1 != null,避免走到链表末尾后仍继续移动;
    • 跳过M个节点后,立即判断curr1是否为null,若为null则直接退出循环,不执行后续删除操作。
  2. 删除N个节点时的边界判断:

    • 移动curr2时,判断的是curr2.next != null,确保不会把curr2移动到null节点;
    • 即使链表剩余节点不足N个,也能安全删除剩余所有节点,不会触发NPE。
  3. main方法第127行的排查:

    • 若该行是遍历打印链表的代码,必须添加temp != null的判断(如示例中所示);
    • 若该行是调用deleteNNodesAfterEveryMNodes后的链表操作,检查是否处理了链表头为null的情况(比如当整个链表被删除后,head会变为null)。

内容的提问来源于stack exchange,提问作者userUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:05:17