500个人围成一圈,从第一个人开始数数,数到第三个人,第三个人就退出,然后从第四个人开始继续数到3就退出一人,最后只城下一个人的时候就输出那个人的下标!????????? 
class Kid{ 
int id; 
Kid right; 
Kid left; 
  } 
class KidCircle{ 
int count=0; 
Kid first,last; 
  KidCircle(int n){ 
   for(int i=0;i <n;i++){ 
   Add(); 
      } 
   } 
   
   void Add(){ 
   Kid k=new Kid(); 
   k.id=count; 
   if(count <=0){ 
   first=k; 
   last=k; 
   k.left=k; 
   k.right=k; 
     }  
    else{ 
   k.right=first; 
   first.left=k; 
   k.left=last; 
   last=k; 
     } 
   count++; 
  } void Delete(Kid k){ 
if(count <=0){ 
return; 
    } 
else if(count==1){ 
first=last=null; 
     }else { 
k.left.right=k.right; 
k.right.left=k.left; 
  } 
if(k==first){ 
first=k.right; 
  }else if(k==last){ 
last=k.left; 
       } 
count--; 
   } } 
 
public class Count3Quit2{ 
public static void main (String [] args){ 
KidCircle kc=new KidCircle(500); 
int countNum=0; 
Kid k=kc.first; 
while(kc.count>1){ 
countNum++; 
if(countNum==3){ 
kc.Delete(k); 
countNum=0; 
         } 
k=k.right; 
      } 
System.out.println(k.count); 
    } 
}

解决方案 »

  1.   

    代码好长有乱,我给你个我以前写的时候的思路
    我当时是用队列来处理的
    首先把所有元素都入队,然后从队首去取元素,每次取一个并且记数,当记数是1和2的时候把取出的元素又入队尾,当记数是3的时候就把取出的元素扔掉。
    当然,每次取的时候都查一下队列里面还有没有元素,如果没有的话,就输出它的号码我当时是用Integer 作为元素的
      

  2.   

    add()里else里应该是:
    last.right=k;
    k.left=last;
    k.right=first;
    first.left=k;
    last=k;