Java 按顺序从单链表中删除重复项

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

所以我有一个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;
        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)表示我们不查看节点的结尾,这会弄乱列表的结尾