This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center




7年前关闭。





所以我有一个列表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之后的条件实际上将忽略检查最后一个节点,因此将其删除。

编辑:

此外,您还必须更改行if (iter.value == currNode.next.value)

从现在开始,它将尝试也检查哪个currNode.next = null的最后一个节点。因此,您必须将其更改为:

if (currNode.next != null && iter.value == currNode.next.value)


总的来说,您应该从下一个节点开始检查,即:currNode = iter.next,保留先前的指针并更改检查相等性的条件,如下所示:

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;
    }
}

10-01 00:22