好的,我的想法就是在循环列表中移动到每个节点(在这种情况下是用户)并询问他们是否要注销,他们会给出一个随机的是或否答案,直到每个人都记录关闭。这似乎是大多数情况下我运行该程序的情况,但有时用户正在重新登录,这应该不会发生,我将发布删除方法和我正在使用的显示方法。
public void displayLinkedList() {
temp=first;
int i = 1;
do {
boolean rand=randomBoolean();
if(rand) {
System.out.println("USER : "+temp.data+" Logged off ");
temp.isloggedOut=true;
Node placeholder = temp.nextNode; //save value of temp.next before we delete temp
delete(temp);
Node.numOfUsers--;
temp = placeholder; //reassign "temp" to the appropriate next value.
} else if(!temp.isloggedOut) {
System.out.println("USER : "+temp.data+" Logged on ");
temp=temp.nextNode;
}
} while(Node.numOfUsers!=0);
}
public void delete(Node n) {
if(Node.numOfUsers == 0 || n == null) return; // 0 nodes or null parameter.
Node temp = first;
if(temp.nextNode == null) { //only one node
temp = null; //simply delete it
} else {
while(temp.nextNode != n) {
temp = temp.nextNode;
if(temp == first) { //if we circle the entire list and don't find n, it doesn't exist.
return;
}
}
temp.nextNode = n.nextNode; // perform the switch, deleting n
}
}
答案 0 :(得分:1)
我认为你的问题就在这一行
else if(!rand)
添加一个检查用户是否已被删除的布尔值
else if(!rand && !userExists)
答案 1 :(得分:0)
在上面的代码中,您将temp
变量从此列表中删除后引用它。这可能会导致一些问题。调整为以下代码。
do {
boolean rand=randomBoolean();
if(rand) {
System.out.println("USER : " + temp.data + " Logged off ");
Node placeholder = temp.next; //save value of temp.next before we delete temp
delete(temp);
Node.numOfUsers--;
temp = placeholder; //reassign "temp" to the appropriate next value.
} else {
System.out.println("USER : " + temp.data + " Logged on ");
temp = temp.nextNode;
}
} while(Node.numOfUsers != 0);
另外,有趣的事实。您无需在最初发布的代码中执行else if(!rand)
。将您的第一个案例设为if(rand)
唯一的时间是rand == true
对吗?所以唯一的另一个逻辑情况是rand == false
,所以甚至不需要第二个if
语句检查这个,因为我们知道它不能是其他任何东西。