循环变成无限循环

时间:2014-03-31 14:06:15

标签: java while-loop linked-list nodes

我的代码段正在触发无限循环,我不知道为什么。我之前使用循环本身在同一个程序中将朋友添加到链接列表中它工作正常,所以我不明白它为什么现在变成无限循环。

while (!a.equals("*")){

   curr = friendlist.getUsers().getFront();

   while (curr!=null){

      if (curr.getData().getName().equals(a)){ //why is it not removing friends?
         d.removeFriend(curr.getData());
      }

      curr = curr.getNext();
   }

   System.out.println("Add a friend by typing in their name. Enter * to end. ");
   a = in.nextLine();
}

以上代码从另一个类访问以下段:

public void removeFriend(User u){
    if (friendsList.isEmpty()){
        System.out.println("Empty list, cannot remove.");
    }
    else{
        Node c = friendsList.getFront();
        while (c.getNext()!=null){
            if (c.getNext().getData().equals(u)){ //condition: if the data is the same
                c.setNext(c.getNext().getNext()); //change the link
                c.getNext().setData(null); //set the next data to null (cut the link)
                friendsList.setSize(friendsList.size()-1);
                c = c.getNext();
            }
        }
    }
}

为什么代码运行不正常?

4 个答案:

答案 0 :(得分:0)

正如另一张海报所提到的,你在一个代码块中两次调用getNext()方法。

这就是我认为对你有用的东西

while (c!=null){
    if (c.getNext().getData().oldestFriend().getBirthYear()>c.getData().oldestFriend().getBirthYear()){
        a = c.getNext().getData();
        continue;  //then skip the current iteration, so that your line below after the if statement, wont get called.
    }
    c = c.getNext();
}

为什么不这样做,因为现在看起来你正在调用相同的方法三次!

相反,将从getNext()返回的任何内容存储到一个变量中,然后访问该局部变量并随意执行任何操作,然后分析您喜欢等等。

答案 1 :(得分:0)

通过以下方式更改while

while (c.hasNext() {
    Node oldC = c; 
    c = c.getNext();
    if(c.getData().oldestFriend().getBirthYear() > oldC.getData().oldestFriend().getBirthYear()) {
        a = c.getData();
    }
}

如果有下一个,则只调用getNext()

答案 2 :(得分:0)

你知道无限循环的确切位置吗?也许在System.out.println("loop")curr.getNext()之前加c.getNext(),看看哪一个失败了?

将此添加为评论,但我还不允许:(

答案 3 :(得分:0)

的语义如何?
allUsers.getFront()

它只是抓取头部还是更像弹出操作?

如果是提取,则

的递归调用可能存在问题
oldestFriend()
在方法oldestFriend()。

虽然在那种情况下我会期待StackOverflowException。