新学数据结构的菜鸟求各位大神给个代码参考下约瑟夫环怎么做! 35

题目描述已知n个人(以编号1,2,3...n分别表示)按既定的方向围坐在一张圆桌周围。从编号为k的人开始按既定方向报数,数到m的那个人出列;他的下一个人又从1开始报数,数... 题目描述
已知n个人(以编号1,2,3...n分别表示)按既定的方向围坐在一张圆桌周围。从编号为k的人开始按既定方向报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列

样例输入
9
1
5
样例输出
5
1
7
4
3
6
9
2
8
用java链表做,谢谢各位
展开
 我来答
B2K1bonPplR
2016-10-05 · TA获得超过2049个赞
知道小有建树答主
回答量:1156
采纳率:72%
帮助的人:391万
展开全部
import java.util.Scanner;

public class 约瑟夫问题链表 {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    int k = scanner.nextInt();
    int m = scanner.nextInt();
    scanner.close();
    约瑟夫(n, k, m);
  }

  /**
   * 求解约瑟夫问题。
   * 
   * @param n
   *          起始总人数。
   * @param start
   *          起始报数人编号。
   * @param m
   *          报到该数的人出列。
   */
  public static void 约瑟夫(int n, int start, int m) {
    if (n <= 0 || start <= 0 || m <= 0 || start > n) {
      return;
    }

    LinkList list = createList(n);
    moveHead(list, start);
    out(list, m);
  }

  /**
   * 从链表头开始数到第 m 个出列。
   * 
   * @param list
   * @param m
   */
  private static void out(LinkList list, int m) {
    if (m <= 0 || list.head == null) {
      return;
    }
    while (list.head != null) {
      moveHead(list, m);
      System.out.println(list.head.no);
      if (list.head != list.tail) {
        list.tail.next = list.head.next;
        list.head.next = null;
        list.head = list.tail.next;
      } else {
        list.head.next = null;
        list.head = null;
        list.tail = null;
      }
    }
  }

  private static LinkList createList(int n) {
    LinkList list = new LinkList();
    for (int i = 1; i <= n; i++) {
      Node node = new Node(i);
      if (list.tail == null) {
        node.next = node;
        list.head = node;
        list.tail = node;
      } else {
        list.tail.next = node;
        list.tail = node;
        list.tail.next = list.head;
      }
    }
    return list;
  }

  /**
   * 链表向后循环移 n-1 个节点。
   * 
   * @param list
   * @param n
   */
  private static void moveHead(LinkList list, int n) {
    if (n <= 1 || list.head == null) {
      return;
    }
    for (int i = 1; i < n; i++) {
      list.head = list.head.next;
      list.tail = list.tail.next;
    }
  }

  private static class Node {

    public int no;
    public Node next;

    public Node(int no) {
      this.no = no;
    }
  }

  /**
   * 单向循环链表。
   * 
   */
  private static class LinkList {
    public Node head;
    public Node tail;
  }
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式