我正在做一个约瑟夫环 怎样做才能成为一个循环的链表?
是在最后的myNode类最什么改变吗?/*c current    表示当前节点
 * ci currentindex  表示当前节点的下标
 * i=index  起始节点的下标
 *
 * */public class A{
    myNode first;
    int length;
    void Init(){    
        first=null;
    }    
    void Tshow(){
        myNode c=first;
        while(c!=null){            
            c.show();
            c=c.next;
        }    
    }
    
//**********************************
    int length(){
         length=0;
        myNode c=first;
        while(c!=null){
            length++;
            c=c.next;
        }
        return length;
    }
    
//**********************************    
    void add(int value){
        myNode newN=new myNode();
        newN.data=value;
        add(newN);
    }    
    void add(myNode newN){
        if(first==null){
            first=newN;
            return;
        }
        /*
        myNode c=first;//使当前节点为first
        while(c.next!=null){//如果c的下面一个节点不是空的 就一个个的往后挪
            c=c.next;            
        }
        c.next=newN;//会执行此句话 表示c已经是最后一个节点 那么将新的节点赋给c.next
        */
        //当然了 上面那一部分也是对的  不过都用c==null和del ins的方法一致
        myNode p;
        myNode c=first;
        while(c!=null){
            p=c;
            c=c.next;
            if(c==null){
                p.next=newN;
                return;
            }
        }                    
    }    
//约瑟夫环开始
//**********************************
    void Joseph(int i){
        /*if(i==0){
        if(first==null)
            return;
        first=first.next;
        }*/
        int ci=0;//我想一开始从位置值0开始 就是第一个节点
        myNode p;
        myNode c=first;       
        length=length();//返回现有节点的个数
        while(length>1){
          int data=c.re();//读入节点的数据
          for(int m=1;m<=data;m++){
          p=c;
                 c=c.next;
                 if(m==data){
                  c.show();// 问题就在这里 因为还没有实现循环链 执行一次后这里就空了
                  p.next=c.next;
                  c=c.next;
                 }
          }
                                                  
                length=length-1;
            }
        
       
        
    }//**********************************    
    public static void main(String args[]){
        A ob=new A();
        //ob.Init();        
        ob.add(2);
        ob.add(3);
        ob.add(4);
        ob.add(1);
        ob.Joseph(0);        
        
    }
}
class myNode{
    int data;
    myNode next;
    void show(){
        System.out.println(data);
    }
    int re(){
        return data;
    }

解决方案 »

  1.   

    将最后一个节点的next域指向第一个节点。约瑟夫生死游戏应该是不需要头结点的循环链表。
    比如建表时,若采用尾插法,每次插入新节点时将其next指向第一个节点。
      

  2.   

    可是我已经采用新节点联在前面节点的后面,就不行么?若最后一个用c.next!=null表示 那么第一个又应该怎样表示?
      

  3.   

    /*c current    表示当前节点 
    * ci currentindex  表示当前节点的下标 
    * i=index  起始节点的下标 

    * */ public class A{ 
        myNode first; 
        int length; 
        void Init(){    
            first=null; 
        }    
        void Tshow(){ 
            myNode c=first;
            if(c!=null){
             do{
             c.show(); 
             c=c.next; 
             }while(c!=first);
            }    
        } 
        
    //********************************** 
        int length(){ 
            length=0; 
            myNode c=first;
            if(c!=null){
             do{
             length++; 
             c=c.next; 
             }while(c!=first);
            } 
            return length; 
        } 
        
    //**********************************    
        void add(int value){ 
            myNode newN=new myNode(); 
            newN.data=value; 
            add(newN); 
        }    
        void add(myNode newN){ 
            if(first==null){ 
                first=newN; 
                newN.next=first;
                return; 
            } 
            /* 
            myNode c=first;//使当前节点为first 
            while(c.next!=null){//如果c的下面一个节点不是空的 就一个个的往后挪 
                c=c.next;            
            } 
            c.next=newN;//会执行此句话 表示c已经是最后一个节点 那么将新的节点赋给c.next 
            */ 
            //当然了 上面那一部分也是对的  不过都用c==null和del ins的方法一致 
            myNode p; 
            myNode c=first;
            p=c;
            c=c.next; 
            while(c!=first){ 
                p=c; 
                c=c.next; 
            }
            p.next=newN;
            newN.next=first;
                                
        }    
    //约瑟夫环开始 
    //********************************** 
    //------你是不是没有理解发约瑟夫问题啊?不是应该报数,报到某一个数时,这个人出列吗?
    //所以我修改一下你的代码:
    //num表示,数到num,这个人出列.
        void Joseph(int num){ 
            /*if(i==0){ 
            if(first==null) 
                return; 
            first=first.next; 
            }*/  
            myNode c=first,p=first;
                  
            length=length();//返回现有节点的个数 
            while(length>1){ 
             //int data=c.re();//读入节点的数据 
             for(int m=1;m <num;m++){
             p=c; 
                 c=c.next;
             }
             if(first==c){
             first=c.next;
             }
             p.next=c.next;
             c=p.next;
             Tshow();
             System.out.println("----------");
             length--;
            } 
        } //**********************************    
        public static void main(String args[]){ 
            A ob=new A(); 
            //ob.Init();        
            ob.add(1); 
            ob.add(2); 
            ob.add(3); 
            ob.add(4); 
            ob.Joseph(3);        
            
        } 

    class myNode{ 
        int data; 
        myNode next; 
        void show(){ 
            System.out.println(data); 
        } 
        int re(){ 
            return data; 
        } 

      

  4.   

    不是应该报数,报到某一个数时,这个人出列吗?
    应该是报数 但报的数是删去的那个人所持有的密码,也就是每个节点的data呀,所以每次轮回,所数的数都不应该相同 ,因为他们的密码不同啊,所以我用data ,
    你这样做每次数的就是一个数了。