2017-12-09 9 views
3

私はリンクされたリストを反復し、すべての3番目の要素を再帰的に削除したいと思います。リンクリストからすべての3番目の要素を再帰的に削除するにはどうすればよいですか?

リストの最後に達した場合、リンクされたリストに残っている要素について同じ呼び出しを行います。私はリンクされたリストに1つの要素しか残されなくなるまでそれをやっています。期待通りに動作しない

私のソリューション:

import java.util.LinkedList; 
import java.util.List; 

    public class test { 

    public static void main(String[] args) { 
     int randomNumber = (int)(Math.random() * 50 + 1); 
     List<Integer> testList = new LinkedList<Integer>(); 

     for (int i = 1; i <= randomNumber; i++) 
     { 
      testList.add(i); 
     } 
    } 
     public void removeElements(List testList) 
     { 
      for(int i = 0; i < testList.size();i++){ 
       if(i % 3 == 0){ 
        testList.remove(i); 
       } 
      } 
      if(testList.isEmpty()){ 
       return; 
      } 
      removeElements(testList-1); 
     } 
} 
+0

だから、唯一の1が残っているまで、あなたが再帰的にすべての第三の要素を削除しているが、2つの要素がある場合、あなたは最後から二番目の再帰呼び出しに何を削除しますあなたはすべての3番目を削除するはずですか?おそらく、リストのサイズが2でない場合、ベースケースは1でなければならないでしょうか? – prsvr

+0

私は何が行われたのかを説明した回答を追加しました。以下を確認してください。 – prsvr

答えて

3

再帰的に実行している場合は、反復する必要はありません。問題を1つの反復まで単純化し、現在の状態に適用し、残りのリストに適用します。ノードクラスのようには見えないので、インデックスを使って行う必要があります。

3つ目の要素を削除すると、現在の2つの要素が保持され、後の要素が削除されます。リストを削除するとリストが「シフト」することも考慮しなければならないため、削除後に前進する必要はありません。次の「現在」は、削除したインデックスと同じインデックスになります。あなたはどのn番目の項目に更新するので

List<Integer> list = new LinkedList<Integer>(); 
list.add(1); 
list.add(2); 
list.add(3); 
list.add(4); 
list.add(5); 
list.add(6); 
list.add(7); 
list.add(8); 
list.add(9); 
list.add(10); 

removeElements(list); 

for (int x = 0; x < list.size(); x++) 
    System.out.println(list.get(x)); 

// output: 1 2 4 5 7 8 10 

public void removeElements(List list) { 
    removeElements(list, 0); 
} 

例:常に方法を準備をすることを避けるために

public void removeElements(List list, int current) { 
    int removeIndex = current + 2;  // remove the third element 
    if (removeIndex >= list.size()) // if there isn't one, stop 
     return; 

    list.remove(removeIndex);   // if there is one, remove it 
    removeElements(list, removeIndex); // continue with the rest of the list 
} 

、あなたはあなたのためにそれをしない秒1を書くことができますこれを削除するには、現在のインデックスに追加された値を変更して簡単に変更できます。

public void removeElements(List list, int current, int n) { 
    int removeIndex = current + n - 1; // remove the nth element 
    if (removeIndex >= list.size())  // if there isn't one, stop 
     return; 

    list.remove(removeIndex);    // if there is one, remove it 
    removeElements(list, removeIndex, n); // continue with the rest of the list 
} 

public void removeEverySecond(List list) { 
    removeElements(list, 0, 2); 
} 

public void removeEveryThird(List list) { 
    removeElements(list, 0, 3); 
} 

// etc. 
+0

白い反復処理を削除する場合、list.size()は評価を変更しませんか? – dreamcrash

+0

@sad_catはい、テストするたびに正確です。私たちは取り除くことが何も残っているとすぐにやめます。 –

+0

しかし、OPはすべての3番目の要素を削除したいと考えています – dreamcrash

0

あなたが反復処理されているリストから項目を削除しています。それは脆弱です。反復が大きくなる一方、リストは小さくなります。これにより、IndexOutOfBoundsにエラーが発生します。

リストのコピーを作成して、そのコピーをorinalの繰り返しに基づいて削除し、縮小したコピーを返すことをお勧めします。

0

すべての3番目の要素を再帰的に削除します。

とコード

if(i % 3 == 0){ 
       testList.remove(i); 
      } 

コードが最初を削除し、すべての第三のようにそれが見えます。本当にあなたは何を期待していますか?しかし、あなたはそれを修正する場合は、

0
package com.company; 

import java.util.Arrays; 
import java.util.LinkedList; 
import java.util.List; 

public class Main { 

    public static void main(String[] args) { 

     List<Integer> list = new LinkedList<>(Arrays.asList(1,2,3,4,5,6,7,8,9,10)); 

     removeRecursive(list); 

     System.out.println("The elements that remained in the list are: " + list); 

    } 


    public static void removeRecursive(List<Integer> list){ 

     if (list.size() < 3) 
      return; 

     for (int i = 2; i < list.size(); i += 2) { 
      System.out.println("Removing element " + list.remove(i) + " from the list."); 
     } 

     removeRecursive(list); 

    } 
} 

OKを述べた@GCP問題に直面することになるので、私はここでやっていることは次のとおりです。

は、私は再帰的なメソッドを呼び出して、1から10までの整数のLinkedListのを宣言します再帰的メソッドがジョブを終了した後にリストの最終的な内容を出力する。 RECURSIVE方法では

:私たちは、引数として整数のLinkedListのを取る

、私たちのベースケースはリスト場合です。3つ未満の要素がある場合、3つ目の要素を削除することはできません(明らかに)ので、size()は3未満です(3つ目の要素をすべて削除する必要があるため)それを削除する場合は、ループが終了するたびにを2つ増やすので、リストの最後に達するまで3番目の要素をすべて削除し続けます。次に、再帰的メソッドをもう一度呼び出すと、LinkedListに残りの要素がすべて渡されます。リストのサイズが3未満の場合、再帰的メソッドが実行されます。その後、メインに戻り、すべてが終わったらリストに残っている要素を表示します。 1,2,3,4,5,6,7,8,9,10のリストについては、

出力:

はリストから要素3を取り外します。

リストから要素6を削除します。

リストから要素9を削除します。

リストから要素4を削除します。

リストから要素8を削除します。

リストから要素5を削除します。

リストから要素7を削除します。

リストから要素10を削除します。

リストに残った要素は次のとおりです。[1、2]

関連する問題