循环链表—约瑟夫环问题

来源:互联网 发布:新加坡航空 知乎 编辑:程序博客网 时间:2024/05/15 09:55

  假设n个人决定选出一个领导,将所有人排成一个圆圈,沿着这个圆圈每次数到M个人就排除对应着者,每当有人出列后,其余人靠拢,任然保持一个完整的圆圈,。问题就是找出剩下的那个人是谁,这就是所谓的约瑟夫问题。

算法思想:为了以一种循环方式排列人群,我们构建一个循环链表,每个人与循环左边的人之间构成一个链接,整数i表示循环之中第i个人,生成一个唯一节点的循环链表后(即第一个节点的next指向它自己),在该节点后插入2到N个节点,得到一个从1到N的循环然后跳过M-1个节点,删除第M个节点,依次循环,直到只剩下最后一个节点,就是要寻找的那个数。

                                                                                 

                                                                

                                                                    

#include <stdio.h>#include <stdlib.h>struct Node{int data;struct Node *next;}; typedef struct Node link;int main(){int m, n, i;scanf("%d%d", &m, &n);link *t, *x;t = (link *)malloc(sizeof(link));t -> data = 1;t -> next = t;x = t;for(i = 2; i <= m; i++){x -> next = (link*)malloc(sizeof(link));x = x -> next;x -> data = i;x -> next = t;}while(m != 1){for(i = 1; i < n; i++){x = x -> next;} x -> next = x -> next -> next;m--;}printf("%d", x -> data);return 0;}

0 0
原创粉丝点击