自定义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
相关产品推荐
相关产品推荐

