【约瑟夫环】C语言数组法+java循环链表法

 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 }

 

posted @ 2021-11-06 12:59  bug_killer  阅读(50)  评论(0编辑  收藏  举报