Java Circular Linked list, Deleting inconsistencies

柔情痞子 提交于 2020-01-06 02:20:09

问题


Ok so the idea for me is to be moving to each node(user in this case) in a circular list and asking if they would like to log off,they will give a random yes or no answer,until everyone has logged off. this seems to be the case most of the time i run the program but sometimes users are logging back on which shouldn't happen,I will post the delete method and the display method i am using.

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

回答1:


I think your problem is in this line

else if(!rand)

Add a boolean that checks if the user has been deleted

else if(!rand && !userExists)



回答2:


In the above code, you reference the temp variable AFTER deleting it from this list. This is likely causing some problems. Adjust to be the code below.

    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);

Also, fun fact. Theres no need to do else if(!rand) in the code you originally posted. By having your first case as if(rand) the only time this is true is when rand == true right? So the only other logical case is that rand == false, so there is no need to even have a second if statement checking this, because we know it can't be anything else.



来源:https://stackoverflow.com/questions/33402934/java-circular-linked-list-deleting-inconsistencies

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!