java - 删除双向链表中的节点时出现问题

标签 java data-structures linked-list doubly-linked-list

因此,我正在构建自己的双向链表类(不是为了家庭作业,只是尝试构建自己的库以供以后使用),并且在实现removeAll方法时遇到一些困难。这是相关代码(如果您需要更多,请告诉我):

//ptr is a pointer node that moves through the list

//removes all nodes with type data
public void removeAll(T data) {
    while (findNode(data) != null) {
        deleteNode(findNode(data));
    } // end of while
} // end of removeAll method

//deletes single node
private void deleteNode(Node<T> del) {
    // del is head node 
    if (del.prevNode == null)
        removeFirst();
    // del is tail node
    else if (del.nextNode == null)
        removeLast();
    else {
        del.nextNode.prevNode = del.prevNode;
        del.prevNode.nextNode = del.nextNode;
        size--;
    } // end of if-else
} // end of deleteNode method

//returns node that matches criteria
private Node<T> findNode(T data) {
    ptr = head; // reset pointer
    while(ptr != null) {
        if(ptr.data == data)
            break;
        else {
            ptr = ptr.nextNode;
        } // end of if-else
    } // end of while
    return ptr;
} // end of findNode method

尝试删除 713 的输出(为简单起见,我使用整数):

[ 9 -6 -6 -6 -6 2 3 713 ] // this is just to show all elements in linked list
------------- // divider
[ 9 -6 -6 -6 -6 2 3 713 ]  // after trying to remove 713

我认为最有趣的是,如果我尝试删除所有 -6,removeAll 方法就会起作用。

[ -6 9 -6 -6 -6 2 3 713 -6 ] //added -6 to beginning and end
-------------
[ 9 2 3 713 ] //all -6's gone

就好像 9 和 713 只是这些方法不起作用的随机情况。我认为问题出在 findNode 和 deleteNode 方法中。测试removeFirst和removeLast方法表明它们工作完美并给出正确的输出。非常感谢任何帮助/指导,我已经为此苦苦挣扎了近 6 个小时。

最佳答案

问题出在这一行:

    if(ptr.data == data)

我想你的意思是:

    if (ptr.data.equals(data))

由于您无法在列表中存储 int,因此我假设您的元素类型为 Integer。 Java 会缓存 -6 等常用整数的 Integer 对象,因此当您要求删除所有 -6 时,您会获得对列表中也包含相同的缓存 -6 对象。然后与 == 比较会产生 true,因为 ptr.datedata 是对同一对象的引用。删除有效。 713 没有缓存,因此当您要求删除它时,您会得到一个 Integer 对象。 ptr.datadata 引用两个不同的相同对象。 == 产生 false。没有任何内容被删除。

PS 你不应该想在你的“自己的库供以后使用”中包含双向链表。一方面,您永远不需要双向链表。预定义的 ArrayList 和 ArrayDeque 在几乎所有情况下都能更好地达到相同的目的。另一方面,使用标准库中的类的优势是巨大的。 20 多年来,这些类已被证明是有用的,并且有人为您维护它们。当您使用标准 API 时,您代码的其他读者也会更容易理解它。

链接: Question: Compare two objects with .equals() and == operator

关于java - 删除双向链表中的节点时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951529/

相关文章:

c# - 编写一个函数来比较两个字符串并返回第三个字符串,该字符串仅包含出现在两个字符串中的字母

检查链表循环的算法

javascript - 如何构建这个数据集?

java - Java 上的 Dijkstra : Getting Interesting Results Using a Fibonacci Heap vs. PriorityQueue

java - 不确定根据用户输入计算佣金

java.lang.ClassCastException 编译时检查本来可以用更好的方式处理

JavaScript - 使用数组或链表更快地计算二叉树的高度

c - 如何让我的代码正确打印二进制?

java - JTable 单元格中功能齐全的 JTree 不起作用

java - 将项目分成 3d ArrayList