2017-10-09 7 views
0

とリンクリストの要素のすべてのオカレンスリスト再帰を使用してリストし、LLNodeオブジェクトを返します。私のコードでは、概念的には、ノード(すなわちノード1)が指定された要素(ノード2)の出現を持つノードを指しているかどうかを特定しようとしています。そうであれば、代わりにnode1にnode2はを指しています。要素の最初の発生を削除し、私は<em>が私のリンクから1つの出現または文字列の出現をすべて削除するには</em>と<em>DELETEALL</em>方法を削除実装しようとしています再帰

私のコードは大部分は機能しますが、私が実行している問題はリストの最初のノードをスキップしているようです。

public class LinkedTest { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    LLNode<String>list = new LLNode<>("susan"); 
    list = addNode(list, "matt"); 
    list = addNode(list, "susan"); 
    list = addNode(list, "bob"); 
    list = addNode(list, "matt"); 

    printNodes(list); 

    list = deleteAll(list, "susan"); 
    System.out.println("\nPrint nodes forward after delete of susan"); 
    printNodes(list); 

    list = deleteAll(list, "matt"); 
    System.out.println("\nPrint nodes forward after delete of matt"); 
    printNodes(list); 
} 

public static LLNode<String> addNode(LLNode<String> list, String info) { 
    LLNode<String> newNode = new LLNode<>(info); 
    newNode.setLink(list); 
    list = newNode; 
    return list; 
} 

public static void printNodes(LLNode<String> node) { 
    System.out.println("Print list forward"); 
    while (node != null) { 
     System.out.println(node.getInfo()); 
     node = node.getLink(); 
    } 
} 

public static LLNode<String> delete(LLNode<String> node, String name){ 
    if(node.getLink().getInfo() != name){ 
     delete(node.getLink(), name); 
    } 
    node.setLink(node.getLink().getLink()); 
    return node; 
} 

public static LLNode<String> deleteAll(LLNode<String> node, String name){ 
    if(node.getLink() != null){ 
     deleteAll(node.getLink(), name); 

     if(node.getLink().getInfo() == name){ 
      node.setLink(node.getLink().getLink()); 
     } 
    } 
    return node; 
} 

} 

これを実行すると、これが結果です:あなたは「マット」の最初のインスタンスが削除されていないことを確認することができ、出力で

Print list forward 
matt 
bob 
susan 
matt 
susan 

Print nodes forward after delete of susan 
Print list forward 
matt 
bob 
matt 

Print nodes forward after delete of matt 
Print list forward 
matt 
bob 

。同じ問題はメソッドを実装するときに発生します。 ご迷惑をおかけして申し訳ございません。

答えて

1

を参照してください。getLink().getLink()アラーム音が鳴ります。 getLink()はnullであり、特にコードはあまりにも間接的です。ケースの区別が複雑すぎます。

文字列比較は.equalsになります。最初に出現したの

削除が行くだろう:

public static LLNode<String> delete(LLNode<String> node, String name){ 
    if (node == null) { // Simplest case. 
     return null; 
    } 
    if (node.getInfo().equals(name)) { // Actual deletion work. 
     return node.getLink(); // First occurrence deleted only. 
    } 
    node.setLink(delete(node.getLink(), name)); // Recursion. 
    return node; 
} 

あなたのコードの意図は、再帰的deleteかそこら前にreturnがありませんでした。

+0

私はこれまでと同様のものを実装しようとしていましたが、私を引き上げるのは再帰呼び出しの場所でした。これははるかに理にかなっています、ありがとう! – Mac

+0

また、私はこれを捕まえることができましたが、_delete_はLLNode引数と文字列引数の両方を取ります。 String引数として_name_を追加しました。これは完全に機能しました。 – Mac

+0

他のリーダー用に修正されました。 –

関連する問題