public class A15 {
/**
*n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,
*每次从这个圆圈中删除第m 个数字
*(第一个为当前数字本身,第二个为当前数字的下一个数字)。
*当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。
*求出在这个圆圈中剩下的最后一个数字。
*
* 印象中,这个是数据结构中的一道作业题来着
* @param args
*/
public static void main(String[] args) {
int[] array={1,2,3,4,5,6,7,8};
CircleNode header = CircleNode.initialize(array);
int m = 2;
System.out.println(deleCircleM(header,m));
}
/**
* @param header
* @param m
* @return
*/
private static int deleCircleM(CircleNode node, int m) {
int temp = m;
while(node.getValue() != node.getAfter().getValue()){
//确定删除的元素
while(m>1){
node = node.getAfter();
m--;
}
CircleNode preNode = getPreNode(node);
//保证环不断
preNode.setAfter(node.getAfter());
//当前的节点变为删除后的那个节点
node = node.getAfter();
//恢复m的值,再次的循环
m = temp;
}
return node.getValue();
}
/**
* 得到前一个节点
* @return
*/
private static CircleNode getPreNode(CircleNode node) {
CircleNode temp = node;
while(temp.getAfter().getValue() != node.getValue()){
temp = temp.getAfter();
}
return temp;
}
}
class CircleNode{
private int value ;
private CircleNode after = null;
public static CircleNode initialize(int[] array){
CircleNode header = new CircleNode();
header.setValue(array[0]);
CircleNode temp = header;
for(int i=1;i<array.length;i++){
CircleNode node = new CircleNode();
node.setValue(array[i]);
temp.setAfter(node);
temp = node;
}
//首尾相连
temp.setAfter(header);
return header;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public CircleNode getAfter() {
return after;
}
public void setAfter(CircleNode after) {
this.after = after;
}
}
心平气和的写代码,是一件很快乐的事情。。。
看到一种比较简单的解法:
int f(int n, int m)
{
int i, r = 0;
for (i = 2; i <= n; i++)
r = (r + m) % i;
return r+1;
}