原创

单项环形链表

约瑟夫环问题

设编号为1,2,3,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

思路:

用一个不带头结点的循环链表来处理约瑟夫问题:先构成一个有n个节点单项环形链表,然后由k节点起从1开始计数,到m时,把对应节点从链表中删除,然后再从被删除节点的下一个节点开始从1计数,知道最后一个节点从链表中删除算法结束。

代码示例:

public class Josepfu {
    public static void main(String[] args) {
        SingleCircleLinkedList singleCircleLinkedList = new SingleCircleLinkedList();
        singleCircleLinkedList.Josepfu(1, 2, 5);
    }
}

//创建单项环形链表
class SingleCircleLinkedList {
    //创建一个first节点,当前没有编号
    private Node first;

    /**
     * @param nums 为环形链表添加几个节点
     */
    public void createSingleCircleLinkedList(int nums) {
        if (nums < 1) {
            System.out.println("nums值不正确");
            return;
        }
        Node curNode = null;
        for (int i = 1; i <= nums; i++) {
            //根据编号创建节点
            Node node = new Node(i);
            if (i == 1) {
                first = node;
                first.setNext(first);//构成环
                curNode = first;//让curNode指向第一个节点
            } else {
                curNode.setNext(node);
                node.setNext(first);
                curNode = node;
            }
        }
    }

    /**
     * 遍历当前环形链表
     */
    public void list() {
        if (first == null) {
            throw new RuntimeException("链表为空!");
        }
        Node curNode = first;
        while (true) {
            System.out.println(curNode);
            if (curNode.getNext() == first) {
                break;
            }
            curNode = curNode.getNext();
        }
    }

    /**
     * 根据用户的输入来完成约瑟夫环问题
     *
     * @param startNo  表示从编号几开始数
     * @param countNum 表示数几下
     * @param nums     表示最初有几个人
     */
    public void Josepfu(int startNo, int countNum, int nums) {
        if (nums < 1 || startNo < 1 || startNo > nums) {
            throw new RuntimeException("参数输入有误!");
        }
        createSingleCircleLinkedList(nums);
        Node pre = first;
        //使pre指向first节点的前一个节点
        while (true) {
            if (pre.getNext() == first) {
                break;
            }
            pre = pre.getNext();
        }
        //使first和pre先移动到一开始报数的人那里
        for (int i = 0; i < startNo - 1; i++) {
            first = first.getNext();
            pre = pre.getNext();
        }
        //当第一个人开始报数时,让first和pre指针同时开始移动countNum-1此,然后first指向的节点出圈
        while (true) {
            if (first == pre) {
                break;
            }
            for (int i = 0; i < countNum - 1; i++) {
                first = first.getNext();
                pre = pre.getNext();
            }
            //这时first指向的节点就是要出圈的节点
            System.out.println(first);
            first = first.getNext();
            pre.setNext(first);
        }
        //退出循环后,圈中就只剩下一个节点了。
        System.out.println(first);
    }
}

class Node {
    private int no;

    private Node next;

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

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                '}';
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 腾讯(url.cn)短网址链接生成api接口

    腾讯url短网址api接口是腾讯官方对外公开的长网址转为短网址的API,可以将冗长的链接地址缩短生成 url.cn/xxx 格式的短网址。

    uglyboy
  • 简单获取新浪短网址api接口的方法(附PHP请求示例)

    新浪短网址api是sina平台官对外公开的短网址生成接口,可以将长链接通过接口生成t.cn样式的短链接,可以说是非常好用的。但近期新浪官方开始对已经公布的接口做...

    uglyboy
  • 分享 - 短网址生成接口(最新官方api)

    短网址,顾名思义就是一种较短域名加动态参数组成的短地址,类似于t.cn/xxxx,url.cn/xxx。是由各大平台诸如新浪、腾讯、百度发布的短网址接口将长网址...

    uglyboy
  • 堆外内存概要

    DirectByteBuffer JDK中使用 DirectByteBuffer对象来表示堆外内存,每个 DirectByteBuffer对象在初始化时,都会创...

    于霆霖
  • pytorch基础知识-tensor张量的创建 上

    张量是pytorch神经网络的血液,没有血液的流通就没有整个pytorch躯体的运转。本文将介绍tensor的创建方法,其中包含了多种API代码需要牢记

    用户6719124
  • windows进程详解3

    winmgmt.exe进程文件: winmgmt or winmgmt.exe进程名称: Windows Management Service描述: Windo...

    用户2398817
  • #凯哥将数据#深度解读美国联邦数据战略行动计划

    2019年6月4日,美国行政和预算管理局(OMB)发布了联邦数据战略行动计划(Federal Data Strategy Action Plan)第一阶段的内容...

    凯哥
  • Java常见异常类型及原因分析

    顾名思义,NullPointerException 是空指针异常。但是在 Java 中没有指针,怎么会有 空指针异常呢?

    慕白
  • 田小军:纷争中的手游知识产权保护

    田小军 腾讯互联网法律研究中心 一、中国迎来手游市场爆发增长的产业机遇 2013年,随着智能手机、移动网络的普及,全球手游(即手机游戏)市场迎来了高速...

    腾讯研究院
  • 12个最佳的响应式网页设计教程,轻松带你入门!

    如何让你的网站在其出现的任何设备和屏幕尺寸上能够完美的呈现?响应式设计完美的解决了这一难题,作为现在的网页设计师都应该了解响应式网页设计的原则。而对于刚步入网页...

    奔跑的小鹿

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动