为什么这个无限循环

时间:2020-04-25 03:24:36

标签: java loops while-loop linked-list infinite-loop

对不起,也许这是一个新手问题。但这是我的讲师的作业,截止日期是明天。我已经尝试了许多方法来跟踪输出,但是仍然导致无限循环。请帮忙。

问的问题:

将通过的学生从studentList中删除,并将其移动到新的LinkedList passList

主要应用:

StudentLinkedList failList = studentList; //assume studentList is already existed with some data
StudentLinkedList passList = new StudentLinkedList();

Student s = (Student)studentList.removeFirst(); //the return type was Object (it was user-defined LinkedList)
//so i use dynamic binding to change it to student
while(s != null) {
  if(s.isPass()) { //return true if student passed
    System.out.println("pass"); //i track my output with this
    passList.addFirst(s);
  } else {
    System.out.println("fail"); //track output
    failList.addFirst(s);
  }
  s = (Student)studentList.removeFirst();
}

输出是失败和通过之间的无限循环,我认为该循环是因为s永远不会为空。

这里删除第一个方法定义:

public Object removeFirst() {
   if(head == null) { //check if the list was empty
     return null;
   } else {
     current = head;
     head = head.next;
     if(head == null) {
        tail = null;
     }
     return current.element;
   }
}

我第二年学习Java。您的帮助将不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:2)

根据代码,您正在分配StudentLinkedList failList = studentList;。这不会创建studentList的副本,也不会分配新的内存,而是意味着failList指向studentList

因此,在failList中所做的任何更改实际上都在studentList中进行了更改。

这很有意义,为什么在遇到失败的学生时会出现无限循环,因为您实际上只是将学生添加回初始的studentList而不是新创建的failList