双端队列在插入后为第一个元素返回 null
Deque returning null for first element after insertion
当我将一个元素添加到我的 Deque 并立即尝试检查它时,它 returns 为空。我已经确保进入的元素不为空。这里有什么问题:
已经尝试检查方法是否 运行,add 方法在 DLL 和 Deque 中运行。我也试过 queueTail 并重复排队,它仍然给我相同的 NullPointerException
双向链表class
public class DLL<T>{
private static class Node<T>{
T element;
Node<T> next;
Node<T> prev;
public T getElement() {
return element;
}
public void setElement(T element) {
this.element = element;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
public Node<T> getPrev() {
return prev;
}
public void setPrev(Node<T> prev) {
this.prev = prev;
}
public Node(T ele, Node<T> n, Node<T> p) {
element = ele;
next = n;
prev = p;
}
}
Node<T> header;
Node<T> trailer;
int size;
public DLL() {
size = 0;
header = new Node<>(null,null,null);
trailer = new Node<>(null,null,header);
header.setNext(trailer);
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public T first() {
if(isEmpty()) {
return null;
}
return header.getNext().getElement();
}
public T last() {
if(isEmpty()) {
return null;
}
return trailer.getPrev().getElement();
}
private void addBetween(T ele,Node<T> before, Node<T> after) {
Node<T> newN = new Node<T>(ele,after,before);
before.setNext(newN);
after.setPrev(newN);
size++;
}
public void addFirst(T ele) {
addBetween(ele,header.getNext(),header);
}
public void addLast(T ele) {
addBetween(ele,trailer,trailer.getPrev());
}
private T remove(Node<T> rem) {
Node<T> before = rem.getPrev();
Node<T> after = rem.getNext();
before.setNext(after);
after.setPrev(before);
size--;
return rem.getElement();
}
public T removeFirst() {
if(isEmpty()) {
return null;
}
return remove(header.getNext());
}
public T removeLast() {
if(isEmpty()) {
return null;
}
return remove(trailer.getPrev());
}
}
双端队列class
public class Deque<T>{
private DLL<T> list = new DLL<>();
public Deque() {
}
public void queueHead(T ele) {
list.addFirst(ele);
}
public void queueTail(T ele) {
list.addLast(ele);
}
public T popHead() {
return list.removeFirst();
}
public T popTail() {
return list.removeLast();
}
public boolean isEmpty() {
return list.isEmpty();
}
public int size() {
return list.size();
}
public T peakHead() {
return list.first();
}
public T peakTail() {
return list.last();
}
}
我的 "Main" 方法,运行并尝试通过将 Graph ADT 对象添加到 Deque 中来使用 Deque 的部分,然后尝试使用 toString()
显示它
int population = Integer.parseInt((String) boxPopulation.getSelectedItem());
int perVacc = Integer.parseInt((String) boxVacc.getSelectedItem());
String disease = (String) boxDisease.getSelectedItem();
Disease d = null;
GraphMod grap = null;
com.graph.herdImmunity.Graph<Person> people;
if(disease.equalsIgnoreCase("Measles")) {
d = new Disease("Measles",12,95,6.5);
grap = new GraphMod(perVacc,d);
}
people = grap.initialise(population);//This just fills the graph with dummy data, this works I've tested
Deque<com.graph.herdImmunity.Graph<Person>> days = new Deque<>();
days.queueHead(people);
System.out.println(days.peakHead().toString());//this line gives me a nullpointerexception
你的addBetween
错了。它过于复杂并且具有令人困惑的命名参数。它应该是这样的:
private void addAfter(T ele, Node<T> after) {
Node<T> newN = new Node<T>(ele, after, after.getNext());
after.getNext().setPrev(newN);
after.setNext(newN);
size++;
}
同时拥有 after
和 before
总是会带来问题,您 运行 有混淆它们的风险(就像您所做的那样)并且您不能保证它们是一致的,什么如果我用一对不匹配的元素调用该方法,那将破坏整个列表。
然后您需要通过以下方式调用该方法:
public void addFirst(T ele) {
addAfter(ele, header);
}
public void addLast(T ele) {
addAfter(ele, trailer.getPrev());
}
Java 已经有一个 Deque which can be easily used with ArrayDeque。
如果你坚持使用你制造的东西,你的问题实际上很有趣。
在
public void addFirst(T ele) {
addBetween(ele,header.getNext(),header);
}
您在 before
参数中有 getNext()
。
应该是
public void addFirst(T ele) {
addBetween(ele,header,header.getNext());
}
此外,您应该将名称 "DLL" 更改为其他名称,因为通常称为 "Dynamic Link Library"。
当我将一个元素添加到我的 Deque 并立即尝试检查它时,它 returns 为空。我已经确保进入的元素不为空。这里有什么问题:
已经尝试检查方法是否 运行,add 方法在 DLL 和 Deque 中运行。我也试过 queueTail 并重复排队,它仍然给我相同的 NullPointerException
双向链表class
public class DLL<T>{
private static class Node<T>{
T element;
Node<T> next;
Node<T> prev;
public T getElement() {
return element;
}
public void setElement(T element) {
this.element = element;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
public Node<T> getPrev() {
return prev;
}
public void setPrev(Node<T> prev) {
this.prev = prev;
}
public Node(T ele, Node<T> n, Node<T> p) {
element = ele;
next = n;
prev = p;
}
}
Node<T> header;
Node<T> trailer;
int size;
public DLL() {
size = 0;
header = new Node<>(null,null,null);
trailer = new Node<>(null,null,header);
header.setNext(trailer);
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public T first() {
if(isEmpty()) {
return null;
}
return header.getNext().getElement();
}
public T last() {
if(isEmpty()) {
return null;
}
return trailer.getPrev().getElement();
}
private void addBetween(T ele,Node<T> before, Node<T> after) {
Node<T> newN = new Node<T>(ele,after,before);
before.setNext(newN);
after.setPrev(newN);
size++;
}
public void addFirst(T ele) {
addBetween(ele,header.getNext(),header);
}
public void addLast(T ele) {
addBetween(ele,trailer,trailer.getPrev());
}
private T remove(Node<T> rem) {
Node<T> before = rem.getPrev();
Node<T> after = rem.getNext();
before.setNext(after);
after.setPrev(before);
size--;
return rem.getElement();
}
public T removeFirst() {
if(isEmpty()) {
return null;
}
return remove(header.getNext());
}
public T removeLast() {
if(isEmpty()) {
return null;
}
return remove(trailer.getPrev());
}
}
双端队列class
public class Deque<T>{
private DLL<T> list = new DLL<>();
public Deque() {
}
public void queueHead(T ele) {
list.addFirst(ele);
}
public void queueTail(T ele) {
list.addLast(ele);
}
public T popHead() {
return list.removeFirst();
}
public T popTail() {
return list.removeLast();
}
public boolean isEmpty() {
return list.isEmpty();
}
public int size() {
return list.size();
}
public T peakHead() {
return list.first();
}
public T peakTail() {
return list.last();
}
}
我的 "Main" 方法,运行并尝试通过将 Graph ADT 对象添加到 Deque 中来使用 Deque 的部分,然后尝试使用 toString()
显示它int population = Integer.parseInt((String) boxPopulation.getSelectedItem());
int perVacc = Integer.parseInt((String) boxVacc.getSelectedItem());
String disease = (String) boxDisease.getSelectedItem();
Disease d = null;
GraphMod grap = null;
com.graph.herdImmunity.Graph<Person> people;
if(disease.equalsIgnoreCase("Measles")) {
d = new Disease("Measles",12,95,6.5);
grap = new GraphMod(perVacc,d);
}
people = grap.initialise(population);//This just fills the graph with dummy data, this works I've tested
Deque<com.graph.herdImmunity.Graph<Person>> days = new Deque<>();
days.queueHead(people);
System.out.println(days.peakHead().toString());//this line gives me a nullpointerexception
你的addBetween
错了。它过于复杂并且具有令人困惑的命名参数。它应该是这样的:
private void addAfter(T ele, Node<T> after) {
Node<T> newN = new Node<T>(ele, after, after.getNext());
after.getNext().setPrev(newN);
after.setNext(newN);
size++;
}
同时拥有 after
和 before
总是会带来问题,您 运行 有混淆它们的风险(就像您所做的那样)并且您不能保证它们是一致的,什么如果我用一对不匹配的元素调用该方法,那将破坏整个列表。
然后您需要通过以下方式调用该方法:
public void addFirst(T ele) {
addAfter(ele, header);
}
public void addLast(T ele) {
addAfter(ele, trailer.getPrev());
}
Java 已经有一个 Deque which can be easily used with ArrayDeque。 如果你坚持使用你制造的东西,你的问题实际上很有趣。 在
public void addFirst(T ele) {
addBetween(ele,header.getNext(),header);
}
您在 before
参数中有 getNext()
。
应该是
public void addFirst(T ele) {
addBetween(ele,header,header.getNext());
}
此外,您应该将名称 "DLL" 更改为其他名称,因为通常称为 "Dynamic Link Library"。