Java 如何将节点添加到双链接列表的末尾?
我在课堂上有一个Java作业。它是关于雇员的,所以有三个类,雇员,雇员列表和节点。我被要求做一个双重链接的清单了。链表是我们定制的类,而不是Java提供的类 现在我被困在addEmployee方法中。该方法将参数输入Employee对象,并需要添加到列表的末尾 这是密码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
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