有序链表add方法抛出NullPointerException问题排查求助
问题分析与修复方案
我来帮你定位这个NullPointerException的问题,以及给出完整的修复代码:
问题根源
你遇到的空指针问题出在while (temp.value <= num)这一行,原因是当你添加第二个节点时:
- 假设第一个节点的值是
3,现在要添加5,temp初始指向head(值为3的节点) - 第一次循环判断
3 <= 5成立,执行temp = temp.next,此时temp变成null(因为第一个节点的next还没有赋值) - 下一次循环会尝试访问
null.value,直接触发空指针异常
除此之外,你的代码还有两个隐藏问题:
- 当
temp变为null后,后续的if (temp.next==null)也会触发空指针 - 插入中间节点的代码
newNode.next=temp.next.next是错误的,会跳过一个节点
修复后的完整代码
下面是修正后的代码,覆盖了所有插入场景(头部、中间、尾部):
public class Node { int value; Node next; public Node() {} public Node(int c) { this.value = c; } public boolean hasNext() { return next != null; } } public class SortedList { Node head; public int listCount; public SortedList() { listCount = 0; this.head = null; } public void add(int num) { Node newNode = new Node(num); // 处理空链表的情况 if (head == null) { head = newNode; listCount++; System.out.println("Node with data " + num + " was added."); return; } Node temp = head; Node prev = null; // 找到第一个值大于num的节点,prev记录它的前一个节点 while (temp != null && temp.value <= num) { prev = temp; temp = temp.next; } // 场景1:num比所有节点都小,插入到头部 if (prev == null) { newNode.next = head; head = newNode; } else { // 场景2/3:插入到中间或尾部 newNode.next = prev.next; prev.next = newNode; } listCount++; System.out.println("Node with data " + num + " was added."); } }
修复说明
- 循环条件优化:先判断
temp != null,再访问temp.value,彻底避免空指针 - 增加prev指针:跟踪当前节点的前一个节点,确保能精准找到插入位置
- 覆盖所有场景:
- 空链表直接赋值head
- num最小:插入到链表头部
- num最大:插入到链表尾部
- num在中间:插入到对应位置
- 修正插入逻辑:把错误的
newNode.next=temp.next.next改成newNode.next=prev.next,保证链表节点连续无跳跃
内容的提问来源于stack exchange,提问作者Marina
相关产品推荐
相关产品推荐

