从双链接列表中删除小于给定值(java)的所有节点
我想删除所有小于给定数据的节点的数据 但它一直抛出空指针异常 问题解决了,但我自己尝试过更新,现在运行良好。下面的代码运行良好从双链接列表中删除小于给定值(java)的所有节点,java,data-structures,Java,Data Structures,我想删除所有小于给定数据的节点的数据 但它一直抛出空指针异常 问题解决了,但我自己尝试过更新,现在运行良好。下面的代码运行良好 public void delete更小(int数据){ dNode电流=水头; dNode电流; lastCurrent=头。上一个;//(1) dNode nextCurrent=当前。下一步; while(当前!=null){ 如果(数据>=当前数据){ if(current.Previous==null){ nextCurrent.setPrevious(nul
public void delete更小(int数据){
dNode电流=水头;
dNode电流;
lastCurrent=头。上一个;//(1)
dNode nextCurrent=当前。下一步;
while(当前!=null){
如果(数据>=当前数据){
if(current.Previous==null){
nextCurrent.setPrevious(null);/(2)
}否则{
lastCurrent.setNext(nextCurrent);
nextCurrent.setPrevious(lastCurrent);//(3)
}
}
current=current.getNext();
lastCurrent=当前。上一个;
nextCurrent=current.Next;
}
}
(1) 如果列表为空,即head
为空,则调用previous
将导致NPE
(2) 如果列表只有1个节点,即头节点的nextCurrent
为空,则调用setPrevious
将导致NPE
(3) 如果current
节点是最后一个节点,nextCurrent
将为空,如上所述
在分配或调用任何dNode方法之前,您应该执行空检查。您正在检查前一个节点是否为空,这很好,因为当前节点可以是头节点,但当当前节点是尾节点(即链接列表中的最后一个节点)时又如何?您还需要检查下一个节点是否为空,以及当前节点是否是列表中唯一需要删除的节点(即下一个和上一个节点是否为空)
只需检查while循环后的最后一个节点,“但它一直抛出异常”=>我们应该猜到吗?还是什么?那个么循环的目的是什么@AngelKohnull指针异常精确@SeelenvirtuoseThen看,我已经完成了所有检查,但没有成功。顺便说一句,谢谢你的回答真的很有帮助。我尝试了你的代码,但现在没有删除任何节点idk为什么。但是你的回答真的很有帮助
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;
}
}
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;
}
}
while(current!= null){
if(data >= current.data){
if (current.Next == null && current.Previous == null)
{
current = null;
break;
}
if(current.Previous == null){
nextCurrent.setPrevious(null);
}else if(current.Next == null){
previousCurrent.setNext(null);
}else{
lastCurrent.setNext(nextCurrent);
nextCurrent.setPrevious(lastCurrent);
}
}
current=current.getNext();
lastCurrent=current.Previous;
nextCurrent=current.Next;
}