Java采用循环链表结构求解约瑟夫问题_java

本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法。分享给大家供大家参考。具体分析如下:

这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难。

约瑟夫问题:
有n个人,其编号分别为1,2,3,…,n。这n个人按顺序排成一个圈。现在给定s和d,从第s个人开始从1依次报数,数到d的人出列,然后又从下一个人开始又从1开始依次报数,数到d的人又出列,如此循环,直到最后所有人出列为止。要求定义一个节点类,采用循环链表结构求解约瑟夫问题。

以下java版的答案:

复制代码 代码如下:

import java.util.Scanner;
public class LinkNode {              //单向链表的节点类
    public int data;                 //存放节点值
    public LinkNode next;            //存放节点值的引用
   
    public LinkNode(int k){         //构造方法 ,值为k的节点
        data = k;
        next= null;
    }
}
 class Josephus{
    public static void printJosephus(int n,int s,int d){       
        int i=1;                    //创建长为n的循环列表
        LinkNode q,tail;
        
        LinkNode head = new LinkNode(i);
        head.next = head ;
        tail = head;             //第一个节点,尾巴和头在一起
       
        while(i<n){
            i++;
            q = new LinkNode(i);    //增加一个新节点
            q.next = head ;        //节点的引用指向头
            tail.next = q;            //最后一个元素的引用指向了q
            tail = q;              //那么最后一个元素就是q
        }

        int j= 0;               //从s开始报数,依次输出出列人的编号
        LinkNode p = head;      //计数起点
        while(j<s-1){
            j++;
            p = p.next;
        }
        while(p.next != p){
            j = 1;
            while(j<d-1)   //计数的起始点
            {
                j++;
                p = p.next;
            }       
            System.out.print(p.next.data + " ");  // 输出出列的节点号
            p.next = p.next.next;
            p = p.next;                                //不断指向下一个节点           
        }
        System.out.print(p.data);
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int a = input.nextInt();
        int b = input.nextInt();
        Josephus.printJosephus(n, a, b);
    }
}

希望本文所述对大家的Java程序设计有所帮助。

时间: 2024-08-01 10:19:55

Java采用循环链表结构求解约瑟夫问题_java的相关文章

java使用回溯法求解数独示例_java

复制代码 代码如下: import java.util.Calendar;import java.util.Date; public class Matrix {  private int matrix[][]; private long timeAfter=0;  private long timeBefore =0; public Matrix(int m[][]) {  matrix = new int[9][9];  for (int i=0; i<9 ; i++)   for(int

java采用中文方式显示时间的方法_java

本文实例讲述了java采用中文方式显示时间的方法.分享给大家供大家参考.具体如下: 其中t为秒,比如有时候需要计算两个任务相差多久,或者该任务何时结束或者某个任务间隔多久重新启动等适用于本方法.如果是微秒,自己先/1000 private static String chinese_period(int t){ int y, n, d, h, m, s; String time; if(t<=0) return "立即"; s = t % 60; t /= 60; m = t %

Java的单根结构

在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个基础类继承.在Java中(与其他几乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基础类的名字很简单,就是一个"Object".这种"单根结构"具有许多方面的优点. 单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型.另一种方案(就象C++那样)是我们不能保证所有东西都属于相同的基本类型.从向后兼容的角度看,这一方案可与C模型更好地配合,而

方法-循环列表求解约瑟夫环游戏用C++

问题描述 循环列表求解约瑟夫环游戏用C++ 简单的循环链表求解约瑟夫环游戏,传说有30个旅客同城做一条船,因为严重超载,加上风浪大作,危险万分.因此船长告诉大家,只有将乘客一半入海中,其他的人才能幸免遇难.无奈,大家只好同意这种方法,并议定30个人围成一圈,由第一个数起,依次报数,数到第九人,便把他扔入大海,然后再从他的下一个人数起,数到第九人,再将他扔入大海,如此循环地进行,直到剩下15个乘客为止.问那些位置将是被扔下大海.,将30个改为任意输入的正整数N,报数上限也改为一个任意的正整数k.

java访问private方法求解

问题描述 java访问private方法求解 java里如何从一个类访问另一个类的private方法 求解,就是成员变量我都知道怎么办,方法不懂 解决方案 如果是内部类,可以访问,外部类,就不行了,你还是老老实实遵守面向对象的规则吧 解决方案二: 可以用反射,但是尽量不要破坏规则,别人用private,是有别人自己的用意的. 解决方案三: Java private方法访问 解决方案四: 既然是私有的当然无法访问 把它改成public就可以啊 解决方案五: 利用反射的原理就对私有的属性进行访问.如

JAVA冒泡排序和二分查找的实现_java

冒泡排序  冒泡排序(Bubble Sort),看到这种算法,我就想起一句话"小数上浮,大数下沉",通过层层的比较使小数浮出水面,而使大数"石沉水底".从而达到排序的效果.冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下

实例分析java中重载与重写的区别_java

本文以实例详细分析了Java中重载与重写的区别,感兴趣的朋友可以参考一下. 一.重载(Overloading): (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方

java树型结构

使用一个JTree可以简单地像下面这样表示: add(new JTree( new Object[] {"this", "that", "other"})); 这个程序显示了一个原始的树状物.树状物的API是非常巨大的,可是--当然是在Swing中的巨大.它表明我们可以做有关树状物的任何事,但更复杂的任务可能需要不少的研究和试验.幸运的是,在库中提供了一个妥协:"默认的"树状物组件,通常那是我们所需要的.因此大多数的时间我们可

java字符串拆分,求解,在线等,急用

问题描述 java字符串拆分,求解,在线等,急用 [美元/日元] [超买超卖]请注意:美元/日元威廉指标出现超卖情况,指标利多,现价为109.17 这段话需要拆分成三部分: [美元/日元] [超买超卖] 请注意:美元/日元威廉指标出现超卖情况,指标利多,现价为109.17 求代码.谢谢 解决方案 Pattern p = Pattern.compile("(\[.*?\])\s+(\[.*?\])(.*)"); Matcher m = p.matcher("[美元/日元] [超