Java循环链接列表,删除不一致

时间:2015-10-28 22:50:00

标签: java adt nodes circular-list

好的,我的想法就是在循环列表中移动到每个节点(在这种情况下是用户)并询问他们是否要注销,他们会给出一个随机的是或否答案,直到每个人都记录关闭。这似乎是大多数情况下我运行该程序的情况,但有时用户正在重新登录,这应该不会发生,我将发布删除方法和我正在使用的显示方法。

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
                    }
                }

2 个答案:

答案 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语句检查这个,因为我们知道它不能是其他任何东西。