惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
月光博客
月光博客
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
罗磊的独立博客
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
量子位
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
博客园 - 聂微东
V
V2EX

博客园 - gxc

C#2.0中的泛型约束(转载) 解决‘“System.Configuration.ConfigurationSettings.AppSettings”已过时’的警告 《雷神之锤III》里求平方根倒数的函数 回溯法(vc)百鸡百钱问题 回溯法(vc)八皇后问题 六十六条经典禅语 prototype.js和Ajax 悖论 标签的使用(2) 标签的使用(1) 自底向上的归并排序 自顶向下的归并排序 归并排序之归并算法 找质数算法(Sieve of Eratosthenes筛法) 堆排序 直接选择排序 快速排序算法 Some of the new features from ASP.NET 2.0 在ASP.NET中使用AJAX
Josephus问题(循环链表)
gxc · 2005-12-27 · via 博客园 - gxc

假如有M个人想用以下方法来选出一个领袖:M个人围成一个圈,从某个人开始按顺序数数,每次数到N那个人出局,最后仅存的那个人就是领袖。
用循环链表来表示这M个人,不断循环链表,每当数到N,那个结点去掉,直到只剩一个结点为止。
class Node
    {
        public int index;//表示第几个人
        public Node next;
        public Node(int x, Node t)
        {
            index= x;
            next = t;
        }
    }

    class Program
    {
        //用尾插法(新插入的结点总在最后)建一个循环链表
        static Node CreateLister(int m)
        {
            Node head,s,r;
            //第一个结点
            head = new Node(1, null);
            head.next = head;
            //尾指针
            r = head;
            for (int i = 2; i <= m; i++)
            {
                s = new Node(i, head);//新结点,指向头指针
                r.next = s;//新结点插入表尾
                r = s;//尾指针指向新的表尾
            }
            r.next = head;//表尾的下一个接着表头,形成循环
            return r;//返回尾指针
        }

        static void Main(string[] args)
        {         
            const int M = 9;
            const int N = 5;
            Node x = CreateLister(M);

            while (x != x.next)
            {
                //跳到出局的人的前一个人
                for (int i = 1; i < N; i++)
                {
                    x = x.next;
                }
                Console.Write(x.next.item.ToString() + ",");
                x.next = x.next.next;//第N个人出局
            }
            Console.Write(x.item.ToString());
            Console.Read();          
        }
    }