2016-07-24 15 views
2

java内のリンクリスト内のすべてのevensを削除するにはどうすればよいですか?他の同様の質問は私を助けませんでした。私は可能な解決策を持っていますが、複雑すぎるようです。私はそれが動作するかどうかはわかりません。リンクリスト内のすべてのevensを削除する方法java

public class Node { 
public int value; 
public Node next; 
public Node (int val) { 
    value = val; 
} 
public Node removeNode (Node root) { 
    if (root == null || (root.next == null && isOdd(root.value))) { 
     return null; 
    } 
    Node deep = root; 
    while (deep.next != null) { 
     deep = deep.next; 
    } 
    if (isOdd(deep.value)) { 
     for (Node x = root; x != null; x = x.next) { 
      if (isOdd(x.next.value)) { 
       x.next = x.next.next; 
      } 
     } 
    } else { 
     for (Node x = root; x.next != null; x = x.next) { 
      if (isOdd(x.next.value)) { 
       x.next = x.next.next; 
      } 
     } 
    } 
    if (isOdd(root.value)) { 
     root = root.next; 
    } 
    return root; 
} 
public boolean isOdd (int val) { 
    return (val % 2 == 1); 
} 

このソリューションを改善するにはどうすればよいですか?

+0

リンクされたリストからノードを削除するロジックを混在させて、ノードの値が偶数であるかどうかを心配することは避けてください。後で他の条件に基づいてノードを削除する必要がある場合は、「ノードの削除」コードを別の機能にコピーし、ノードが削除されているかどうかを変更するだけです。述語(真/偽を返す関数)を取る関数を作成し、それを使ってノードが削除されているかどうかを判断します。 – Carcigenicate

+0

@BrandonChen私は自分の投稿を編集してより簡単できれいにしました。それがあなたのために働くかどうか私に教えてください! – ParkerHalo

答えて

4

まず、removeメソッドは、Nodeクラスではなく、LinkedListクラスにする必要があります。

それだけでも、ものを取り除くために非常に簡単だと後:

public class LinkedList { 
    private Node root; 

    public void removeEvens() { 
     if (root == null) return; 

     // removing all even nodes after the root 
     Node prev = root; 
     while (prev.next != null) { 
      if (isEven(prev.next)) 
       prev.next = prev.next.next; // next is even: delete it 
      else 
       prev = prev.next;    // next is not even: proceed 
     } 

     // delete root if it's even 
     if (isEven(root)) 
      root = root.next; 
    } 

    private boolean isEven(Node node) { 
     return node.value % 2 == 0; 
    } 
} 
0

あなたは、ルートノードの前に要素を追加することができます。その場合、ルートノードのチェックのためのコードを書く必要はありません。

public class Node { 
    public int value; 
    public Node next; 

    public Node(){} 

    public Node (int val) { 
     value = val; 
    } 

    public static Node removeEvens (Node root) { 
     Node head = new Node(); 
     head.next = root; 

     for (Node node = head; node.next!=null; node=node.next) 
      if (isEven(node.next)) 
       node.next = node.next.next; 

     return head.next; 
    } 

    public static boolean isEven(Node node) { 
     return node.value % 2 == 0; 
    } 
} 
+0

説明なしのコードのみが良い例ではありません!これは常に正しく動作するとは限りません(ルートノードが偶数の場合はどうなりますか、ルートノードがnullの場合はどうなりますか)。 – ParkerHalo

関連する問題