Java 按顺序从单链表中删除重复项
所以我有一个0.1,3.0,4.5,-1,3.0,-10.0,3.0,3.0的列表 我应该在下面的代码之后得到一个0.1,3.0,4.5,-1.0,-10.0的列表Java 按顺序从单链表中删除重复项,java,list,linked-list,duplicates,Java,List,Linked List,Duplicates,所以我有一个0.1,3.0,4.5,-1,3.0,-10.0,3.0,3.0的列表 我应该在下面的代码之后得到一个0.1,3.0,4.5,-1.0,-10.0的列表 public void removeDuplicates() { if (head == null) return; Node iter = head; while (iter != null) { Node currNode = iter; whi
public void removeDuplicates()
{
if (head == null)
return;
Node iter = head;
while (iter != null)
{
Node currNode = iter;
while (currNode != null && currNode.next != null)
{
if (iter.value == currNode.next.value)
{
currNode.next = currNode.next.next;
nItem--;
}
currNode = currNode.next;
}
iter = iter.next;
}
}
我甚至用了一段时间,直到我修复并运行了它,然后意识到这里也出了问题
因为我现在得到0.1,3.0,4.5,-1.0,-10.0,3.0。为什么最后一个3.0版本会出现?我起初以为它可能是被圈起来的,但意识到我没有做过那种事。关于逻辑流的建议?在代码中,
while(currNode!=null&&currNode.next!=null)
&&运算符具有currnode.next!=null实际上将忽略检查最后一个节点,因此将删除该节点
编辑:
此外,如果(iter.value==currenode.next.value)
从现在起,它也将尝试检查最后一个节点,该节点的currNode.next=null
。因此,您必须将其更改为:
if (currNode.next != null && iter.value == currNode.next.value)
总的来说,您应该从下一个节点开始检查,即:currNode=iter。接下来,保留上一个指针并更改检查相等性的条件,如下所示:
public void removeDuplicates()
{
if (head == null)
return;
Node iter = head;
while (iter != null)
{
Node prevNode = iter;
Node currNode = iter.next;
while (currNode != null)
{
if (iter.value == currNode.value)
{
prevNode.next = currNode.next;
nItem--;
} else {
prevNode = currNode; //updating prevNode in case of not a match
}
currNode = currNode.next;
}
iter = iter.next;
}
}
Node currende=iter代码>=>节点currNode=iter.next代码>//检查从下一个节点开始
while(currNode!=null&&currNode.next!=null)
=>while(currNode!=null)
//不要选中null节点&&currNode.next!=在while条件下为null
…将其删除。这忽略了最后一个元素。这在if(iter.value==currNode.next.value)处给了我一个空指针异常,这难道不意味着它不能处理currNode.next.value为空的情况,我必须单独写出它吗?请参见shg
答案来解决这个问题。这在if处给了我一个空指针异常(iter.value==currNode.next.value)这难道不意味着它无法处理currNode.next.value为null的情况,而我必须单独写出它吗?这很奇怪,我遵循您的逻辑,但它一定是错误的-我仍然在同一行获得NullPointerException您可以编辑问题并更新/添加更改的代码和获得e的行吗错误?啊-无需指出错误。我得到的结果没有错误,但仍然有2个3.0跟踪列表,因此迭代只删除了列表末尾3.0中的一个3.0。我认为这是因为if(cuurNode!=null&&itervalue=currNode.next.value)表示我们不查看节点的结尾,这会弄乱列表的结尾