约瑟夫环问题
约瑟夫环:
1、一群人围在一起坐成环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,
4、一直循环,直到所有人出列,
解决此问题,通过使用循环链表来解决,需要注意的是,循环过程中不需要头结点的参与,因此在数据添加完成后,应使最后一个结点指向头结点的next结点
即本应是:
现在是:
让头结点不参与循环。才能使得数据正常输出,代码如下:
package List;
public class yuesefu {
Node root;
Node rnode;
public void init_yuesefu(){
root=new Node();
root.next=root;
rnode=new Node();
rnode.next=root;
}
public void yuesefu_add(int n){
for(int i=1;i<=n;i++) {
Node node = new Node(i);
rnode.next.next=node;
node.next=root;
rnode.next=node;
}
//添加完毕后,将根节点去除循环
rnode.next.next=root.next;
}
public void yuesefu_print(int n){
//pnode指向当前删除结点
Node pnode=new Node();
//将pnode初始化为根节点,
pnode=root;
int i=1;
//当向后遍历三个结点的结果是自己时,退出循环,说明此时结点不足三个
System.out.println("开始删除");
while(pnode.next!=pnode){
for(;i<=n-1;i++){
pnode=pnode.next;
}i=1;
System.out.println("此次删除的数据为:"+pnode.next.getData());
pnode.next=pnode.next.next;
}
}
public static void main(String[] args){
yuesefu ysf=new yuesefu();
ysf.init_yuesefu();
ysf.yuesefu_add(10);
ysf.yuesefu_print(3);
}
}
运行结果: