猿问

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

当我将元素添加到我的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();

    }



BIG阳
浏览 95回答 2
2回答

HUWWW

你错了。它过于复杂,并且具有令人困惑的命名参数。它应该是这样的:addBetweenprivate void addAfter(T ele, Node<T> after) {&nbsp; &nbsp; Node<T> newN = new Node<T>(ele, after, after.getNext());&nbsp; &nbsp; after.getNext().setPrev(newN);&nbsp; &nbsp; after.setNext(newN);&nbsp; &nbsp; size++;}两者都有并且总是会引入问题,你冒着混淆它们的风险(就像你所做的那样),你不能保证它们是一致的,如果我用不匹配的元素对调用该方法,那会破坏整个列表。afterbefore然后,您需要通过以下方式调用该方法:public void addFirst(T ele) {&nbsp; &nbsp; addAfter(ele, header);}public void addLast(T ele) {&nbsp; &nbsp; addAfter(ele, trailer.getPrev());}

慕容森

Java已经有一个德克,可以很容易地与数组德克一起使用。如果你坚持使用你制造的问题实际上很有趣。在public&nbsp;void&nbsp;addFirst(T&nbsp;ele)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addBetween(ele,header.getNext(),header); &nbsp;&nbsp;&nbsp;&nbsp;}您在参数中具有。getNext()before相反,它应该是public&nbsp;void&nbsp;addFirst(T&nbsp;ele)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addBetween(ele,header,header.getNext()); &nbsp;&nbsp;&nbsp;&nbsp;}此外,您还应该将名称“DLL”更改为其他名称,因为它通常称为“动态链接库”。
随时随地看视频慕课网APP

相关分类

Java
我要回答