首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除双链接列表中的节点的问题

删除双链接列表中的节点的问题
EN

Stack Overflow用户
提问于 2018-06-20 15:10:12
回答 1查看 168关注 0票数 0

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

代码语言:javascript
复制
//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 (为了简单起见,我使用了整数):

代码语言:javascript
复制
[ 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方法就能工作。

代码语言:javascript
复制
[ -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个小时。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 15:47:05

问题在于这一行:

代码语言:javascript
复制
    if(ptr.data == data)

我想你的意思是:

代码语言:javascript
复制
    if (ptr.data.equals(data))

由于不能将int存储在列表中,所以我假设元素类型为Integer。Java缓存Integer对象用于常用的整数(如-6 ),因此当您要求删除所有-6时,您将得到对列表中相同缓存的-6对象的引用。然后与==进行比较会产生true,因为ptr.datedata是对同一个对象的引用。删除有效。713不是缓存的,所以当您请求删除它时,您将得到一个新的Integer对象。ptr.datadata是引用两个完全相同的对象。==产生false。什么都不会被删除。

PS你不应该包括一个双链接列表在您的“自己的库,供以后使用”。首先,你永远不需要一个双链接的列表。在几乎所有情况下,预定义的ArrayListArrayDeque都能更好地达到相同的目的。另一方面,使用标准库中的类的好处是巨大的。这些课程经过20多年的实践证明是可以使用的,而且你有很多人可以为你维护这些课程。另外,当您使用标准API时,您的代码的其他读者将更容易地理解它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50951529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档