删除双链表中的节点时遇到问题

时间:2018-06-20 15:10:13

标签: 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个小时的努力。

1 个答案:

答案 0 :(得分:1)

问题出在这一行:

    if(ptr.data == data)

我想你的意思是

    if (ptr.data.equals(data))

由于您无法在列表中存储int,因此我假设您的元素类型为Integer。 Java为Integer等常用整数缓存-6对象,因此当您要求删除所有-6时,您将获得对同一缓存的-6对象的引用,该对象也在您的列表中。然后与==进行比较会产生true,因为ptr.datedata是对同一对象的引用。删除工程。 713未缓存,因此当您要求删除它时,会得到一个 new Integer对象。 ptr.datadata是引用两个不同的相同对象。 ==产生false。什么都不会被删除。

PS您不希望在“自己的库中供以后使用”中包含一个双向链接列表。一方面,您将不需要双重链接列表。预定义的ArrayListArrayDeque在几乎所有情况下都能更好地达到相同的目的。另一方面,使用标准库中的类的好处是巨大的。这些类已经证明可以使用20多年了,并且您已经得到了很多人的帮助。使用标准API时,您的代码的其他读者也会更容易理解它。

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