下面约瑟夫环代码中k的等式怎么理解?

package com.seqlist;

import java.util.*;

public class yuesefu {

/**
 * @约瑟夫环
 * 总人数 totalnum
 * 数到几  countnum
 * 第几个出列 k
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int totalnum=11;
    int countnum=6;
    List<Integer> list=new ArrayList();
    //初始化人数
    for(int i=1;i<=totalnum;i++){
        list.add(i);
    }
      int  k=0;
    //开始数数了
    while(list.size()>0){
        //确定出列值k
        k=k+countnum;
        //k的最后一个数 ???
        k=k%list.size()-1;
        //判断是否队尾,k在队伍最后一个数时会有k<0
        if(k<0){
            //处于队尾元素
            System.out.println(list.get(list.size()-1));
            list.remove(list.size()-1);
            k=0;
        }else{
            //
            System.out.print(list.get(k)+" ");
            list.remove(k);
        }
    }
}

}


今天也有一个同学问约瑟夫问题,看到这个好像明白了。其实这个K可以理解为数数开始时前面有几个人,每次循环的时候需要计算从第几个人开始数,然后加上数到几删掉一个,这个时候有可能已经从末尾回到最前面了,因此要进行取模运算。