1 /**
2 约瑟夫环:借助数组
3 len: 表示人数
4 target: 表示喊到该口号的出局。
5 flag: 表示当前哥们喊的口号 范围【1,2,3】
6 default: 从1开始数
7 **/
8 int YSF(int len,int target,int start){
9 int end = len+1;
10 int *a = (int*)malloc(sizeof(int)*end);
11 int i = 0,flag = 1,count = 0;
12
13 //初始化数组元素 都为0
14 for(;i<=len;i++) a[i] = 0;
15
16 //i作为游标
17 i = start;
18 while(count != len-1){
19 //当i游到最后一个元素的时候,应该继续从第一个元素开始
20 if(i == end) i = 1;
21 if(a[i]!=1) {
22 if(flag > target) flag = 1;
23 if(flag == target) { printf("%d ",i); a[i] = 1;count++; }
24 flag++;
25 }
26 i++;
27 }
28 putchar(10);
29
30 //遍历数组元素 找到那个值为0的元素,就是剩下的那个人
31 for(i = 1;i<=len;i++){
32 if(a[i]==0) a[0] = i;
33 printf("%-2d",a[i]);
34 }
35 putchar(10);
36 return a[0];
37 }
1 //约瑟夫环
2 public class Main {
3
4 //定义链表节点类型
5 public static class Node{
6 int data;
7 Node next;
8 }
9
10 //初始化循环链表数据
11 static Node initData(Node head){
12 int[] arr = {1,2,3,4,5,6,7,8,9,10};
13 Node tail = null;
14 for(int i:arr){
15 Node node = new Node();
16 node.data = i;
17 if(i==1) {
18 head = node;
19 tail = head;
20 } else {
21 tail.next = node;
22 tail = node;
23 }
24 }
25 tail.next = head;
26 return head;
27 }
28
29 //打印循环链表
30 static void printLK(Node head){
31 Node p = head;
32 while(p.next!=head){
33 System.out.print(p.data+" ");
34 p = p.next;
35 if(p.next==head) System.out.print(p.data+" ");
36 }
37 System.out.println();
38 }
39
40 //模拟约瑟夫环过程
41 // p 当前节点
42 // pre 当前节点的前一个节点
43 // t 当前节点的后一个节点
44 static void YSF(Node head){
45 Node pre=null,p,t=null;
46 p = head;
47 int flag = 1;
48 while(p.next!=p){
49 if(flag==3){
50 t = p.next;
51 pre.next = t;
52 p = t;
53 flag = 1;
54 } else {
55 pre = p;
56 p = p.next;
57 flag++;
58 }
59 }
60 System.out.println(p.data);
61 }
62
63 //主函数
64 public static void main(String[] args) {
65 Node head = null;
66 head = initData(head);
67 printLK(head);
68 YSF(head);
69 }
70 }