约瑟夫问题
2016-11-30 11:39
399 查看
import java.util.*; /* 单向链表 */ class Child{ public int num;//编号 public Child nextChild;//下一个小孩 public Child(int num){ this.num = num; } } /** 约瑟夫问题,用单向链表(思考:用双向链表) */ class Main{ public static void main(String[] args){ List<Child> list = new ArrayList<Child>(); //创建50个小孩,加入到集合中 for(int i = 0;i<50;i++){ Child c = new Child(i); list.add(c); } //将小孩连起来 for(int i = 0;i<50;i++){ if(i<49){ Child c = list.get(i); c.nextChild = list.get(i+1); }else{ list.get(i).nextChild = list.get(0); } } /* for(int i = 0;i<50;i++){ System.out.print(list.get(i).num+"\t"); System.out.println(list.get(i).nextChild.num); } */ Child temp = list.get(0);//指针,初始值为指向第0个小孩 int n = 5;//数到5,该小孩退出, int k = 2;//从编号为2的小孩开始报数 while(temp.nextChild !=temp){ //1、先找到开始数数的人 for(int i=0;i<k;i++){ temp = temp.nextChild; } //2、数n下,指针temp刚好指向数第n下的这个小孩 for(int j = 1;j<n;j++){ temp = temp.nextChild; } //找到要出圈的小孩的前一个小孩(因为是单向链表,所以只能找一个循环才能找到) Child temp2 = temp;//要出圈的小孩 while(temp2.nextChild !=temp){ temp2 = temp2.nextChild; } //3、移除该小孩 //让要出圈的前一个小孩的nextChild指向要出圈的小孩的下一个小孩 temp2.nextChild = temp.nextChild; } System.out.println(temp.num);//最终小孩的编号 } }
相关文章推荐
- UVALive3882-And Then There Was One-约瑟夫问题-递推
- 约瑟夫问题
- POJ 3517 And Then There Was One (递推,约瑟夫问题变形)
- 约瑟夫问题
- 找规律(约瑟夫的数论问题,uva 1363)
- 约瑟夫问题(c++)
- sdut1197约瑟夫问题
- AC日记——约瑟夫问题 codevs 1282
- 用循环链表求解约瑟夫问题
- 约瑟夫问题的实现
- 约瑟夫问题 oj
- 约瑟夫问题
- 约瑟夫问题--双向循环链表的创建与删除
- SDUT 1197 约瑟夫问题
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 约瑟夫问题概述
- 约瑟夫问题----循环链表
- hdu 5643 King's Game 数学 约瑟夫问题
- 约瑟夫问题3
- 【待解惑问题(已解决)】约瑟夫(Josephus)环问题