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

自定义LinkedList实现冒泡排序 超4元素报NullPointerException如何修复

问题描述

以下为自定义链表(LinkedList)数据结构的实现代码,采用冒泡排序对链表内元素排序,运行时输入元素数量超过4个时,程序会抛出NullPointerException异常。
我的实现代码如下:

public class Main {
    
    Node head = null;
    Scanner sc = new Scanner(System.in);
    int number;
    
    void insert() {
        System.out.println("Enter the number of data. ");
        number = sc.nextInt();
        for (int i = 0; i < number; i++) {
            System.out.println("Enter the data.");
            int data = sc.nextInt();
            Node n = new Node(data);
            if (head == null) {
                head = n;
            } else {
                n.next = head;
                head = n;
            }
        }
    }
    
    void sorting() {
        Node temp = head;
        for (int i = 0; i < number - 2; i++) {
            for (int k = 0; k < number - i - 2; k++) {
                while (temp.data > temp.next.data) {
                    int data1 = temp.data;
                    temp.data = temp.next.data;
                    temp.next.data = data1;
                    System.out.println(2);
                }
                System.out.println(1);
                temp = temp.next;
            }
        }
    }
    
    void print() {
        Node temp = head;
        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
    }
    
    class Node {
        int data;
        Node next;
        
        Node(int data) {
            this.data = data;
            this.next = null;
        }
    }
    
    public static void main(String[] args) {
        Main n = new Main();
        n.insert();
        n.sorting();
        n.print();
    }
}

请问该如何定位并修复这个问题?

问题定位

异常根源在sorting()方法的三处逻辑错误:

  • 每轮外层排序开始前,没有将遍历指针temp重置回链表头节点head。第一轮内层循环跑完后temp已经移动到链表中后段,后续轮次直接从该位置继续向后遍历,很快就会指向null,此时访问temp.data或temp.next就会触发空指针。
  • 循环边界计算错误。长度为n的链表做冒泡排序需要n-1轮外层遍历,原有代码用number-2作为内外层循环的边界阈值,元素数大于3时就会出现遍历越界。
  • 相邻节点比较逻辑错误。原有代码用while循环对同一对相邻节点反复交换,会卡在当前位置死循环,不符合冒泡排序逐节点向后遍历比较的规则。
修复方案

直接替换原有sorting()方法即可,修复后可正常处理任意长度的输入链表,排序逻辑符合预期:

void sorting() {
    // 链表为空或仅1个节点时无需排序
    if (head == null || head.next == null) {
        return;
    }
    // 外层循环:n个元素共需n-1轮排序
    for (int i = 0; i < number - 1; i++) {
        // 每轮排序开始前,必须将遍历指针重置到头节点
        Node temp = head;
        // 内层循环:每轮将1个最大元素沉到末尾,遍历长度逐轮减1
        for (int k = 0; k < number - i - 1; k++) {
            // 相邻节点逆序则交换值
            if (temp.data > temp.next.data) {
                int tmpData = temp.data;
                temp.data = temp.next.data;
                temp.next.data = tmpData;
            }
            // 指针后移,遍历下一对相邻节点
            temp = temp.next;
        }
    }
}

内容的提问来源于stack exchange,提问作者Avinash Kumar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:39:18