当前位置: 首页 > 知识库问答 >
问题:

双链表java从后面删除

孟胤
2023-03-14

每次我运行我的双链接列表时,除了从列表后面删除外,所有方法都有效。我有一张4,3,9的单子。我从前面拆下(这拿走了4个)。然后,我调用了这个方法,它应该只删除9。相反,当我调用DL列表时,它返回null(这也删除了3)。请帮忙。

    public Object removeLast() {
    Object result = null;

    if (!isEmpty()) {
        result = lastNode.getData();
        lastNode = lastNode.getPreviousNode();

        if (lastNode == null)
            firstNode = null;
        else
            lastNode.setNextNode(null);
    }
    return result;
}

下面是代码的其余部分(它扩展了一个接口;生成的代码对于这个问题不是必需的,所以我们没有填写它。也就是说,节点后面的内容无关紧要)正确的代码:

    public class DList implements DoubleEndedListInterface {

    public Node lastNode;
    public Node firstNode; // reference to first node
    public int numberOfEntries;

    @Override
    public String toString() {
        return "" + firstNode;

    }

    public Node getNodeAt(int givenPosition) {
        assert !isEmpty() && (1 <= givenPosition)
                && (givenPosition <= numberOfEntries);
        Node currentNode = firstNode;

        // traverse the list to locate the desired node
        for (int counter = 1; counter < givenPosition; counter++)
            currentNode = currentNode.getNextNode();

        assert currentNode != null;

        return currentNode;
    } // end getNodeAt

    public void addFirst(Object newEntry) {
        Node newNode = new Node(newEntry);

        if (firstNode == null)
        {
            firstNode = newNode;
            lastNode = newNode;
            numberOfEntries++;
        }
        else 
        {
            newNode.setNextNode(firstNode);
            firstNode.setPreviousNode(newNode);
            firstNode = newNode;
            numberOfEntries++;
        } // end if
    } // end add


    public void addLast(Object newEntry) {
        Node newNode = new Node(newEntry);

        if (firstNode == null)
        {
            firstNode = newNode;
            //lastNode = newNode;
            numberOfEntries++;
        }
        else 
        {
            lastNode.setNextNode(newNode);
            lastNode = newNode;
            numberOfEntries++;
        } // end if
    } // end add

    @Override
    public Object removeFirst() {
        Object result =  firstNode.getData();
        firstNode = firstNode.getNextNode();
        if (numberOfEntries == 1)
            lastNode = null; // solitary entry was removed

        numberOfEntries--;

        return result; // return removed entry, or
                        // null if operation fails
    } // end remove

    @Override
    public Object removeLast() {
        Object result = null;

        if (!isEmpty()) {
            result = lastNode.getData();
            lastNode = lastNode.getPreviousNode();

            if (lastNode == null)
                firstNode = null;
            else
                lastNode.setNextNode(null);
        }
        return result;
    }

    @Override
    public Object getFirst() {
        // TODO Auto-generated method stub
        return firstNode.getData();
    }

    @Override
    public Object getLast() {
        // TODO Auto-generated method stub
        return lastNode.getData();
    }

    @SuppressWarnings("unchecked")
    @Override
    public void moveToEnd() {
        Object temp = (Object) remove(1);
        add(numberOfEntries + 1, temp);

    }

    public class Node {
        public Object data; // entry in bag
        public Node next; // link to next node
        public Node previous;

        public Node(Object dataPortion) {
            this(dataPortion, null, null);
        } // end constructor

        public Node(Object dataPortion, Node nextNode, Node previousNode) {
            data = dataPortion;
            next = nextNode;
            previous = previousNode;
        } // end constructor

        public Object getData() {
            return data;
        } // end getData

        public void setData(Object newData) {
            data = newData;
        } // end setData

        public Node getNextNode() {
            return next;
        } // end getNextNode

        public Node getPreviousNode() {
            return previous;
        }

        public void setPreviousNode(Node previous) {
            this.previous = previous;
        }

        public void setNextNode(Node nextNode) {
            next = nextNode;
        } // end setNextNode

        @Override
        public String toString() {
            return "Node [data=" + data + ", next=" + next + "]";
        }

    } // end Node

    @Override
    public void add(Object newEntry) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean add(int newPosition, Object newEntry) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object remove(int givenPosition) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean replace(int givenPosition, Object newEntry) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object getEntry(int givenPosition) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean contains(Object anEntry) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int getLength() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isEmpty() {
        boolean result;

        if (numberOfEntries == 0) // or getLength() == 0
        {
            assert firstNode == null;
            result = true;
        } else {
            assert firstNode != null;
            result = false;
        } // end if

        return result;
    } // end isEmpty

    @Override
    public void swap(int i, int j) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isTooBig() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void reduceArray() {
        // TODO Auto-generated method stub

    }

    @Override
    public Object[] toArray() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void makeRoom(int newPosition) {
        // TODO Auto-generated method stub

    }

    @Override
    public void removeGap(int givenPosition) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean removeObject(Object anObject) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int getPosition(Object anObject) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void append(ListInterface bList) {
        // TODO Auto-generated method stub

    }
}

共有2个答案

闻梓
2023-03-14

我看到的是:

addFirst看起来不错,似乎此方法应该可以正常运行。

addLast似乎不正确。特别是,如果通过addLast将节点添加到空列表中,lastNode成员变量将没有有效值。

然后RemveFirstRemveLast都需要帮助,特别是在处理NumberOfEntry成员和检查空列表时。

对于“list begins empty”条件,还应将“next”和“previous”指针设置为null,这样就不会有杂散数据干扰。

党星鹏
2023-03-14

removeLast非常合理,尽管可能缺少一个——numberOfEntries。其余的代码我没有读,因为它有点太多了。

但是add很奇怪:它似乎使用了一个局部变量lastNode对一些字段lastNode什么也不做。

 类似资料:
  • 我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用

  • 我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是

  • 我正在做一个双链表的实现。我希望链表有一定的长度限制。当列表变长时,删除最后一个节点。我这里有些问题。我想定义尾巴,这样我就不必寻找终点。下面是我正在研究的实现,它将允许长度为4,然后开始删除最后一个节点。 它似乎在删除最后一个节点,但之后会打印一些奇怪的符号。我猜这是我如何释放的问题,但我想不出来。注意:此代码中的一些代码取自https://gist.github.com/mycodeschoo

  • 我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果

  • 公共类LinkedList11{//私有内部类节点 }

  • 问题内容: 我想从排序的链表{0 1 2 2 3 3 4 5}中删除重复项。 ` ` prev.setNext(tempHeader)在while循环内无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。 Printlist函数仅使用标题指针并打印列表。 节点定义如下。 问题答案: 循环已排序,因此您知道重复项将彼此相邻。如