循环链表—约瑟夫环问题
2016-11-13 15:45
369 查看
假设n个人决定选出一个领导,将所有人排成一个圆圈,沿着这个圆圈每次数到M个人就排除对应着者,每当有人出列后,其余人靠拢,任然保持一个完整的圆圈,。问题就是找出剩下的那个人是谁,这就是所谓的约瑟夫问题。
算法思想:为了以一种循环方式排列人群,我们构建一个循环链表,每个人与循环左边的人之间构成一个链接,整数i表示循环之中第i个人,生成一个唯一节点的循环链表后(即第一个节点的next指向它自己),在该节点后插入2到N个节点,得到一个从1到N的循环然后跳过M-1个节点,删除第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; }
相关文章推荐
- 循环链表中约瑟夫环的问题
- 用单向循环链表解决约瑟夫环(Joseph)问题
- 第十课 循环链表,约瑟夫环问题的解决
- 约瑟夫环问题单循环链表解法
- 线性表---单循环链表(约瑟夫环问题)
- 约瑟夫环问题--循环链表
- hdoj_5643 King's Game(约瑟夫环问题变种)----超时版本(自己模拟的循环链表)
- 循环链表 约瑟夫环问题实现
- 循环链表与约瑟夫环问题
- 约瑟夫环问题 【循环链表的应用】
- 单循环链表 解决约瑟夫环的问题
- 约瑟夫环问题的亲身实践(和循环链表有关)!
- 循环链表解决约瑟夫环问题
- 循环链表-约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 循环链表 CircleList的实现并解决约瑟夫环问题
- 循环链表之约瑟夫环问题
- 数据结构(4)--循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较
- 循环链表解决约瑟夫环问题
- 循环链表解约瑟夫环问题