0

循環リストを使用して、ジョセフスの問題に従って、最後に立っている人の出力を与えるプログラムを作成する必要があります。ほとんどの場合は機能しているようですが、シリーズに入ると、7(人)1(開始位置)、3(キルカウント)になります。キルの途中でスローされます(リストが2357のとき)。番号に続いてコードを数回調べましたが、この反復で5ではなく3をキルする理由がわかりません。

     import java.util.Scanner;

    class Link{

       public int itemData;
       public Link next;

       public Link(int itemNumber){
       //initialize's data
          itemData = itemNumber;

       }
       public void displayLink(){

          System.out.print("{" + itemData + "}");
       }
    }

    class LinkList{

       private Link first; //first link
       private Link last;
       private Link current;
       public LinkList getCurrent;

       public LinkList(){

          first = null;
          last = null; 
          current = null;


       }

       public boolean isEmpty(){
          return(first == null);
       }
       public void setCurrent(){

          current = current.next;
       }

       public Link getCurrent(){
          return current;
       }
       public void fillList(int listSize){

          for(int i=1; i < listSize + 1; i++){
             Link newLink = new Link(i);

              if(isEmpty()){

                first = newLink;

                current = first;

                }
             else{

                current.next = newLink;


             newLink.next = first;
             last = newLink;
             setCurrent();
           }
       }
     }


       public Link find(int holder, int listSize){
          Link marker = first;


          for(int i = 0; i < listSize; i++){
             if(marker.itemData == holder){

                break;
             }
             else{
                marker = marker.next;
             }
          }

          return marker;
       }
       public void deleteEvery(int holder, int pass, int listSize){

          while(listSize!= 1){

          Link current = find(holder, listSize);

          Link previous = first;


          for(int i = 1; i < pass; i++){
             current = current.next;

          }

          previous = current;     

          current = current.next;


          if(current == first){
                  first = first.next;

          }
          else{

             previous.next = current.next;


          }
          holder = current.next.itemData;
          displayList(--listSize);
          }
       }


       public void displayList(int listSize){

          System.out.print("List:");

          Link current = first;

          for(int i = 1; i < listSize+1; i++){
             current.displayLink();
             current = current.next;
          }
          System.out.print("");
       }
    }
        class Josephus{

   public static void main(String[] args){

      LinkList people = new LinkList();
      Scanner input = new Scanner(System.in);


      System.out.print("Please enter 3 integers (size, holder, passing).");

      int listSize = input.nextInt();

      int holder = input.nextInt();
      int pass = input.nextInt();

      people.fillList(listSize);
      people.displayList(listSize);
      people.deleteEvery(holder, pass, listSize);
      }

   } 
4

1 に答える 1

0

deleteEvery() 関数で、if ステートメントも位置の削除を実行する必要があることがわかりました。最初の要素を変更し、次の反復に進みました。

于 2016-02-12T16:58:21.507 に答える