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



所以我正在构建自己的双向链表类(不是为了家庭作业,只是尝试构建我自己的库供以后使用(,并且在实现 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 缓存Integer常用整数(如-6(的对象,因此当您请求删除所有-6时,您将获得对列表中同一缓存-6对象的引用。然后与==进行比较会产生true因为ptr.datedata是对同一对象的引用。删除有效。713 未缓存,因此当您请求删除它时,您将获得一个新的Integer对象。ptr.datadata是引用两个不同的相同对象。==产生false.不会删除任何内容。

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

链接: 问题:使用 .equals(( 和 == 运算符比较两个对象

相关内容

  • 没有找到相关文章

最新更新