Java双向链表删除小于指定值节点:空指针异常问题及解决
解决双向链表删除小于指定值节点时的空指针异常问题
我之前在实现删除双向链表中所有数据小于给定值的节点功能时,遇到了空指针异常的问题,经过调整代码后已经正常运行,现在把问题排查和修复过程分享出来:
最初抛出空指针异常的代码
public void deleteSmaller(int data){ System.out.printf("Deleting data smaller than %d",data); System.out.println(""); dNode current = head; dNode lastCurrent; lastCurrent = head.Previous; dNode nextCurrent = current.Next; while(current!= null){ if(data>=current.data){ if(current.Previous == null){ nextCurrent.setPrevious(null); }else{ lastCurrent.setNext(nextCurrent); nextCurrent.setPrevious(lastCurrent); } } current=current.getNext(); lastCurrent=current.Previous; nextCurrent=current.Next; } }
空指针异常的原因分析
- 初始化阶段隐患:一开始直接赋值
lastCurrent = head.Previous,如果链表头节点的Previous本身就是null,后续操作中使用lastCurrent就可能触发空指针。 - 循环终止条件错误:原循环条件是
current!= null,当current走到链表最后一个节点时,current.getNext()会返回null,此时执行lastCurrent=current.Previous和nextCurrent=current.Next,current已经变为null,访问其属性自然抛出空指针异常。
修正后可正常运行的代码
public void deleteSmaller(int data){ System.out.printf("Deleting data smaller than %d",data); System.out.println(""); dNode current = head; dNode lastCurrent=null,nextCurrent=current.Next ; while(current.Next!= null){ if(data>=current.data){ if(current.Previous == null){ nextCurrent.setPrevious(null); }else{ lastCurrent.setNext(nextCurrent); nextCurrent.setPrevious(lastCurrent); } } current=current.getNext(); lastCurrent=current.Previous; nextCurrent=current.Next; } }
关键修复点
- 初始化
lastCurrent为null,避免一开始就引用可能为空的head.Previous。 - 调整循环终止条件为
current.Next!= null,确保current走到最后一个节点前就停止循环,避免后续访问null节点的属性。
内容的提问来源于stack exchange,提问作者Hassan Murtaza
相关产品推荐
相关产品推荐

