我被困在这条路上了,它真的开始让我感到沮丧。我想除了这一种方法,其他的我都做得很好。
当我从我的LL中删除一个节点时,我在下一次尝试时得到一个空指针异常,我不知道是什么。
public void timeSlice(int cpuTime){
for(Node curr=head; curr.getNext()!=head; curr=curr.getNext()){
curr.time=curr.time-cpuTime;
System.out.print("<" + curr.pid + ", " + curr.time +">" + " ");
//if the time remaining <= 0 then remove the node
if(curr.time<=0){
System.out.println("nProcess " + curr.pid + " has finished, and is now being terminated");
remove(curr);
}
}
}//end timeSlice
在删除并重新启动方法后发生。我想这是因为我刚去掉了电流,但我不能百分之百确定。
public void remove(Node node){
if(size == 0){
return;
}
else if(size == 1){
removeFirst();
}
else{
Node curr;
for(curr=head; curr.getNext()!=node; curr=curr.getNext()){
;
}
curr.setNext(curr.getNext().getNext());
node.setNext(null);
}
size --;
}//end remove
现在的测试是它将删除倒数第二个节点
这可能是因为head == null。下次发布错误堆栈跟踪,你将有更高的机会得到更准确的答案。
如果head为null,则将curr设置为null,然后在null上调用"getNext()"方法,这将导致nullPointerException。至少,这是我最好的猜测。
在curr
上调用remove
后,curr
的getNext()
将返回null
。然后使用curr
的null
值进入循环的下一次迭代。
你也应该检查null
,即使你修复了。如果节点为空,为什么要进入循环?
一旦在timeSlice()
中调用remove()
, timeSlice()
中的curr
变量指向被删除的节点,curr.getNext()
返回null
,从而导致NullPointerException
。
正如@Catherine建议的那样,您应该保留对前一个节点的引用,并在列表的头部使用一个虚拟节点使其使用更干净。(对不起,我没有足够的代表投票。)
// head.getNext() == head
Node head = new Node();
public void timeSlice(int cpuTime) {
Node prev = head; // A dummy at head.
Node curr = prev.getNext();
for ( ; curr != head; prev = curr, curr = curr.getNext()) {
// ...
if (/* remove? */) {
removeNext(prev);
curr = prev;
}
}
}
public void removeNext(Node node) {
node.setNext(node.getNext().getNext());
}