Java 如何将节点添加到双链接列表的末尾?

Java 如何将节点添加到双链接列表的末尾?,java,linked-list,nodes,doubly-linked-list,Java,Linked List,Nodes,Doubly Linked List,我在课堂上有一个Java作业。它是关于雇员的,所以有三个类,雇员,雇员列表和节点。我被要求做一个双重链接的清单了。链表是我们定制的类,而不是Java提供的类 现在我被困在addEmployee方法中。该方法将参数输入Employee对象,并需要添加到列表的末尾 这是密码 public void add(Employee emp) { Node n = new Node(emp, null , null); if(isEmpty() == true) { setHe

我在课堂上有一个Java作业。它是关于雇员的,所以有三个类,雇员,雇员列表和节点。我被要求做一个双重链接的清单了。链表是我们定制的类,而不是Java提供的类

现在我被困在addEmployee方法中。该方法将参数输入Employee对象,并需要添加到列表的末尾

这是密码

public void add(Employee emp) {
    Node n = new Node(emp, null , null);
    if(isEmpty() == true) {
        setHead(n);
        setTail(n);
        n.setPrevious(null);
        n.setNext(n);
    }else {
        Node c = getTail();
        c.setNext(n);
        n.setPrevious(c);
        setTail(n);
    }
}
简单地说,当列表为空时,该方法会将员工完美地添加到节点中,即使我将第二个员工添加到列表中,也没有问题;但当我再添加,并尝试检索它时,我最终得到了错误的结果

基本上,如果列表已填充,则节点c被分配为列表的尾部。tail或c next为null,但现在是节点n。节点n,因为是尾部之后的下一个元素,所以节点n的上一个链接是节点c,并且尾部更新为节点n

我在这里做错了什么? 如果我尝试

其中list=[a,b,c]; 结果是c,这里应该是b

就是,

head = a, a.getNext().getNext() == c;
c.getPrevious() == b;
但我还是留在c

代码中有什么错误?
请帮忙。非常感谢

您的add方法没有问题,如下代码所示:

public class Q21114229 {

public static void main(String[] args) {

    DLList<Employee> l = new DLList<Employee>();
    l.add(new Employee("a"));
    l.add(new Employee("b"));
    l.add(new Employee("c"));
    System.out.println("Employee b test: " + l.getHead().getNext().getNext().getPrevious().get().getName());
}

static class Node<T> {

    private Node<T> next;
    private Node<T> previous;
    private T value;
    public Node(T value) { this.value = value; }
    public T get() { return value; }
    public Node<T> getNext() { return next; }
    public void setNext(Node<T> next) { this.next = next; }
    public Node<T> getPrevious() { return previous; }
    public void setPrevious(Node<T> previous) { this.previous = previous; }
}

static class DLList<T> {

    private Node<T> head;
    private Node<T> tail;
    public Node<T> getHead() { return head; }
    public Node<T> getTail() { return tail; }
    public boolean isEmpty() { return (head == null); }

    public void add(T value) {
        Node<T> n = new Node<T>(value);
        if (isEmpty()) {
            head = tail = n;
        } else {
            tail.setNext(n);
            n.setPrevious(tail);
            tail = n;
        }
    }

}

static class Employee {

    private String name;
    public Employee(String name) { this.name = name; }
    public String getName() { return name; }
}

}

其他列表方法之一没有正确更新节点的下一个/上一个变量。

除了遵循给定的代码之外,无法帮助找出错误。ifisEmpty==true{setHeadn;setTailn;n.setPreviousnull;n.setNextnull;//n.setNextn;}您认为其中有什么不正确的地方?谢谢我的意思是说。。。您的代码看起来很好,从给定的代码中,我能找出的唯一逻辑问题是isEmpty何时为true n.setNext应该具有null值而不是n。很难解决这个问题。最好设置断点,并在调试模式下运行应用程序,查看节点被错误分配/放置的位置。您可以发布此处使用的每个方法的代码吗?getNext、stNxt、getPrevious、setPrevious……由于某种原因,我无法将其全部发布在这里。
public class Q21114229 {

public static void main(String[] args) {

    DLList<Employee> l = new DLList<Employee>();
    l.add(new Employee("a"));
    l.add(new Employee("b"));
    l.add(new Employee("c"));
    System.out.println("Employee b test: " + l.getHead().getNext().getNext().getPrevious().get().getName());
}

static class Node<T> {

    private Node<T> next;
    private Node<T> previous;
    private T value;
    public Node(T value) { this.value = value; }
    public T get() { return value; }
    public Node<T> getNext() { return next; }
    public void setNext(Node<T> next) { this.next = next; }
    public Node<T> getPrevious() { return previous; }
    public void setPrevious(Node<T> previous) { this.previous = previous; }
}

static class DLList<T> {

    private Node<T> head;
    private Node<T> tail;
    public Node<T> getHead() { return head; }
    public Node<T> getTail() { return tail; }
    public boolean isEmpty() { return (head == null); }

    public void add(T value) {
        Node<T> n = new Node<T>(value);
        if (isEmpty()) {
            head = tail = n;
        } else {
            tail.setNext(n);
            n.setPrevious(tail);
            tail = n;
        }
    }

}

static class Employee {

    private String name;
    public Employee(String name) { this.name = name; }
    public String getName() { return name; }
}

}
Employee b test: b