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

时间:2012-09-28 02:49:06

标签: 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;
        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标记?我首先想到它可能已被环绕/缠绕,但意识到我没有做任何类似的事情。关于逻辑流程的建议?

2 个答案:

答案 0 :(得分:1)

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

<&amp;&amp;&amp; operator 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;
    }
}

答案 1 :(得分:0)

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

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