0

调用 remove 方法后,我调用 display 并得到一个空列表;但是,如果我首先调用 display 方法,它将显示正确的列表,我猜“第一个”值到达了列表的末尾,或者我在某处得到了一个损坏的节点。任何帮助表示赞赏

public class LinkedList {

    private Node first;

    public LinkedList()
    {
        first = null;
    }

    //add students to the list
    public void add(Student s)
    {
        Node newNode = new Node(s);
        newNode.next = first;
        first = newNode;        
    }

    //remove duplicate records (return true if duplicate found)
    public boolean remove(String fn, String ln)
    {
        Student remove;
        boolean found = false;
        int duplicate = 0;
        while(first != null)
        {
            if(first.value.getFname().equals(fn) && first.value.getLname().equals(ln))
            {
                duplicate++;
                if(duplicate > 1)
                {
                    remove = first.value;
                    found = true;  

                }                
            }
            first = first.next;
        }
        if(found)
            return found;
        else
            return found;
    }

    //display list of student
    public void display()
    {
        if(first == null)
            System.out.println("List is empty!");
        else
        {
            while(first != null)
            {
                System.out.println(first.value);
                first = first.next;
            }            
        }            
    }

}

主要的

public class Tester {


    public static void main(String[] args) {

        UnderGrad john = new UnderGrad("john", "doe", 2.7, "computer Science", "phisics");
        UnderGrad jorge = new UnderGrad("jorge", "vazquez", 3.8, "computer Science", "programming");
        UnderGrad john2 = new UnderGrad("john", "doe", 3.0, "Computer Engineering", "phisics");

        Advisor jim = new Advisor("jim", "smith");

        Grad jane = new Grad("jane", "doe", 3.0, "Electric Engineering", jim);       


        LinkedList students = new LinkedList();

        students.add(john);
        students.add(jorge);
        students.add(john2);
        students.add(jane);


        System.out.println(students.remove("john", "doe"));

        students.display();


    }
}

输出

run:
true
List is empty!
BUILD SUCCESSFUL (total time: 1 second)
4

4 回答 4

3

您在方法中使用链表的头部 ( first) 作为迭代器remove。相反,使用局部变量:

for (Node current = first; current != null; current = current.next) {
    if (current.value.getFname().equals(...
    ...
    ...
}
于 2012-06-09T23:56:59.410 回答
1

你有一些错误。你不可能是这个意思: if(found) return found; 否则返回找到;

这将始终返回 true。

设置断点,绘制数据结构的图片(是的,用铅笔)并在调试器中观察数据结构,同时浏览代码。

如果你在这里得到一个代码答案,你也无法弄清楚下一个作业。对不起。

——阿奇博尔德教授。

于 2012-06-09T23:57:21.123 回答
1

单步执行您的代码,并注意first在第一次调用remove(...).

提示:它将是null.

由于是对其内容LinkedList.first的唯一引用,因此在您调用列表后,该列表已“忘记”其包含的内容。LinkedListremove()

于 2012-06-10T00:06:09.283 回答
0

问题出在您的 add() 方法中。进去看看。:)

于 2012-06-09T23:54:44.400 回答