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)

&& 演算子の後の条件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)//null ノードをチェックしない

于 2012-09-28T03:00:17.170 に答える