zoukankan      html  css  js  c++  java
  • 单环形链表解决约瑟夫环

    背景:

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。

    public class CircleLinkList {
        /**
         * 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,
         * 最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
         *
         *
         */
         private People head=null;
    
         public void addNode(People people){
             if(head==null){
                 head=people;
                 head.setNext(people);
                 return;
             }
             People temp=head;
             while (true){
                if(temp.getNext()==head){
                    break;
                }
                temp=temp.getNext();
             }
             if(temp==head){
                 //只有一个节点
                 head.setNext(people);
                 people.setNext(head);
                 return;
             }
             people.setNext(temp.getNext());
             temp.setNext(people);
         }
    
         private void printList(){
             People temp=head;
             if(temp==null){
                 return;
             }
             if(temp==temp.getNext()){
                 System.out.println(temp);
                 return;
             }
             while (true){
                 System.out.println(temp);
                 temp=temp.getNext();
                 if(temp==head){
    
                     break;
                 }
             }
         }
    
         public void delNode(People people){
             if(head==null){
                 return;
             }
             if(people==head && head.getNext()==head){ //只有一个节点
                 head=null;
                 return;
             }
             People temp=head;
             while (true){
                 if(temp.getNext()==people){
                     break;
                 }
                 if(temp.getNext()==head){
                     break;
                 }
                 temp=temp.getNext();
             }
             People next = temp.getNext();
             People next2 = temp.getNext().getNext();
             temp.setNext(next2);
             System.out.println("被干掉了:"+next);
             if(next==head){
                 head=temp;
             }
             next.setNext(null);
    
    
         }
         public void initNumNode(int num){
             if(num<=0){
                 return;
             }
             for (int i = 1; i <= num; i++) {
                 this.addNode(new People(i,"num"+i));
             }
         }
    
        /**
         * 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,
         * 最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
         *
         *
         */
        public void qikefu(){
            this.initNumNode(6);
            People temp=head;
            int i=0;
            while (true){
                if(temp==temp.getNext()){
                    break;
                }
                i++;
                People next = temp.getNext();
                if(i==5){
                    this.delNode(temp);
                    i=0;
                }
                temp=next;
            }
    
        }
    
    
    
    
        public static void main(String[] args) {
            /*People xiao = new People(1, "xiao");
            People ming = new People(1, "ming");
            People hui = new People(1, "hui");
            CircleLinkList linkList = new CircleLinkList();
            linkList.addNode(xiao);
            linkList.addNode(ming);
            linkList.addNode(hui);
            linkList.printList();
            System.out.println("开始删除。。。。。。。");
            linkList.delNode(xiao);
            linkList.delNode(ming);
            linkList.delNode(hui);
            linkList.printList();*/
            CircleLinkList linkList = new CircleLinkList();
            //linkList.initNumNode(5);
            //linkList.printList();
            linkList.qikefu();
    
        }
    
    }
  • 相关阅读:
    Java内存模型总结
    SpringMVC流程源码分析及DispatcherServlet核心源码
    算法学习之剑指offer(十二)
    算法学习之剑指offer(十一)
    为什么局部内部类和匿名内部类只能访问 final 的局部变量?
    Java 中序列化与反序列化
    SpringBoot 上传文件突然报错 Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608
    不能往Windows Server 2008 R2 Server中复制文件的解决方法
    Java 设计模式之单例模式
    Java 设计模式之抽象工厂模式
  • 原文地址:https://www.cnblogs.com/yangxiaohui227/p/13603486.html
Copyright © 2011-2022 走看看