0

リンクリストからノードを削除したい。リンクリストには、次の種類のデータが含まれています(スペースを含むデータが含まれています)

aa 1 1 1 1

bb 2 2 2 2 

ab 3 3 3 3

cc 4 4 4 4 

dd 5 5 5 5

問題は、私のコードがdd 5 5 5 5で作成した最後のノードのみを削除し、他には何も削除しないことです。私のコードを読んで、なぜそれが私に起こっているのか私に解決策を提案してください?

public Node del(String key){
        Node p=first;

        for(Node c=first;c!=null;c=c.next)

        {
           if(c.data.startsWith(key)){
              if(c.next==null){
                  return null;
              }else{
                   p=c;
              }
              if(c==first)
                  first=first.next;
              else
                  p.next=c.next;
              return c;
           }
        }
        return null;
    }

前もって感謝します !

4

5 に答える 5

0
for(currentnode=start; currentnode!=null; currentnode=currentnode.delnext){

        if(currentnode.deldata.startsWith(mykey)){

                        if(currentnode==start)
                            start=start.delnext;
                        else
                            prevnode.delnext=currentnode.delnext;

                        currentnode.deldata=null;

        }

        prevnode=currentnode;
    }

    }

このコードは、コードを修正したチャームのように機能します。ありがとう神様

于 2013-01-03T18:37:16.973 に答える
0

c反復では、現在のノード( )と前のノード('p')を維持する必要があります。そして、それがcあなたが探している鍵を持っているのを見つけたら、それからを設定しp.next = c.nextます。これにより、リストからcが削除されます。次に、空のリスト、1つの要素を含むリスト、および2つの要素を含むリストについてコードをテストします。これらの特殊なケースでは、削除を別の方法で処理する必要があるためです。

于 2012-12-31T09:38:11.693 に答える
0

コードにはいくつかの問題があります。実際に機能する唯一のケースは、リストの最初の要素を削除することです。

私があなたにそれを与えるときよりも、あなたは正しい解決策を見つけることによってより多くを学ぶと思います。紙にリストのスケッチを作成し、変数を観察pcて、プログラムの実行時に参照するノードを確認してください。

プログラムをシングルステップ実行しながら、デバッガーで実行を表示することも役立つ場合があります。

于 2012-12-31T09:39:01.383 に答える
0

次のようにロジックを変更します。

public Node del(String key)
{
    Node p = null;

    for(Node c=first;c!=null;p=c;c=c.next)
    {
       if(c.data.startsWith(key))
       {
           if(c==first)
               first=first.next;
           else
               p.next=c.next;

           c.next = null;
           return c;
       }
    }

    return null;
}

リンクリスト内のノードを削除する場合は、その前のノードへの参照が必要です。p現在のノードの1ノード前に維持される参照cです。forループがどのように変更されているかを確認します。

于 2012-12-31T09:45:46.940 に答える
0

あなたの主な問題(他にもいくつかありますが、あなたが求めたものに焦点を当てます)は、pが常に最初のリンクを指していることです。キーを見つけたときにp.next = c.next、アイテムが最後のリンクで見つかった場合は、first.next他のすべての有効なリンクをスキップして最後のリンクを指します。

例えば ​​:

1-> 2-> 3-> 4-> 5

コードの後よりもkey=4を探すと、リストは次のようになります。

1-> 5

于 2012-12-31T09:46:02.507 に答える