0

所以我有一个 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 标记在一起?我首先认为它可能已经被循环/包裹,但意识到我没有做任何那样的事情。关于逻辑流程的建议?

4

2 回答 2

1

在您的代码中, while (currNode != null && currNode.next != null)

&& 运算符 has 之后的条件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;
    }
}
于 2012-09-28T02:53:23.130 回答
0

Node currNode = iter;=> Node currNode = iter.next;//检查从下一个节点开始

while (currNode != null && currNode.next != null)=> while (currNode != null)//不检查空节点

于 2012-09-28T03:00:17.170 回答