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 }