當我將元素添加到我的Deque,然后立即嘗試檢查它時,它返回null。我已經確保進入的元素不是空的。這里有什么問題:已經嘗試檢查方法是否正在運行,add 方法在 DLL 和 Deque 中運行。我也嘗試過隊列尾部并反復進行排隊,但它仍然給了我相同的空點例外雙鏈列表類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(); }
2 回答

HUWWW
TA貢獻1874條經驗 獲得超12個贊
你錯了。它過于復雜,并且具有令人困惑的命名參數。它應該是這樣的: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++;
}
兩者都有并且總是會引入問題,你冒著混淆它們的風險(就像你所做的那樣),你不能保證它們是一致的,如果我用不匹配的元素對調用該方法,那會破壞整個列表。afterbefore
然后,您需要通過以下方式調用該方法:
public void addFirst(T ele) {
addAfter(ele, header);
}
public void addLast(T ele) {
addAfter(ele, trailer.getPrev());
}
添加回答
舉報
0/150
提交
取消