亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

插入后第一個元素的取消返回空值

插入后第一個元素的取消返回空值

BIG陽 2022-09-28 16:18:09
當我將元素添加到我的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());

}


查看完整回答
反對 回復 2022-09-28
?
慕容森

TA貢獻1853條經驗 獲得超18個贊

Java已經有一個德克,可以很容易地與數組德克一起使用。如果你堅持使用你制造的問題實際上很有趣。在

public void addFirst(T ele) {
        addBetween(ele,header.getNext(),header);
    }

您在參數中具有。getNext()before

相反,它應該是

public void addFirst(T ele) {
        addBetween(ele,header,header.getNext());
    }

此外,您還應該將名稱“DLL”更改為其他名稱,因為它通常稱為“動態鏈接庫”。


查看完整回答
反對 回復 2022-09-28
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號