ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单向循环列表解决约瑟夫(Josepfu)环问题

2019-08-06 17:06:03  阅读:269  来源: 互联网

标签:getNext Josepfu helper 单向 约瑟夫 Person id public first


思路:

核心代码:

public class CircleSingleLinkedList {
    private Person first = null;// 第一个节点

    // 创建一个单项循环列表
    public void add(int nums){
        // 校验一下数据是否合理
        if(nums < 1){
            System.out.println("输入的数据不合理。。");
            return;
        }

        Person cur = null;// 辅助指针,指向当前的节点
        // 创建节点
        for (int i = 1; i <= nums ; i++) {
            // 创建节点
            Person person = new Person(i);

            // 判断节点是否是第一个节点
            if(i == 1) {
                // 添加节点
                first = person;
                first.setNext(person);// 构成环
                cur = first;// 指向当前指针
            }else {
                cur.setNext(person);// 将cur的指向刚刚创建的节点
                person.setNext(first);// 将刚刚创建的节点的next指向第一个节点
                cur = person;// 将cur的指针向后移一位
            }
        }
    }

    // 遍历所有的节点
    public void show() {
        // 判断是否为空
        if(first == null){
            System.out.println("链表为空。。。");
            return;
        }
        Person cur = first;
        while(true){
            System.out.println("编号:"+cur);
            if (cur.getNext() == first) {
                break;// 遍历完毕
            }
            cur = cur.getNext();// cur指向下一个节点
        }
    }

    // 出圈
    /*
    * startNo : 开始的编号
    * countNum : 隔几个输出一次
    * nums : 一共有几个
    */
    public void leave(int startNo,int countNum,int nums){
        if(first == null || startNo > nums || nums < 1) {// 判断是否合法
            System.out.println("参数出入有误");
            return;
        }

        // 将helper指针放在first之前
        Person helper = first;
        for (int i = 0; i < nums ; i++) {
            if(helper.getNext() == first){// 已经找到位置了
                break;
            }
            helper = helper.getNext();
        }
        // 将first和helper移动到指定的位置上去 -- 根据用户输出入的startNo来确定的
        for (int i = 0; i < startNo -1; i++) {
            first = first.getNext();
            helper = helper.getNext();
        }

        // 根据countNum来让出圈
        while(true) {
            if(helper == first){// 圈中只有一个节点
                break;
            }
            for (int i = 0; i < countNum - 1; i++) {// 每次循环都是要确定出圈的节点 first即为要出圈的节点
                first = first.getNext();
                helper = helper.getNext();
            }
            // 出圈
            System.out.printf("出圈的节点序号:%d\n",first.id);
            first = first.getNext();
            helper.setNext(first);
        }
        // 以上的出圈会留下最后一位
        System.out.printf("最后一位节点的序号:%d\n",first.id);
    }

}

 节点:

public class Person {
    public int id;
    public Person next;

    public Person(int id) {
        this.id = id;
    }

    public Person getNext() {
        return next;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                '}';
    }
}

测试:

 public static void main(String[] args) {
        CircleSingleLinkedList linkedList = new CircleSingleLinkedList();
        linkedList.add(125);

        linkedList.show();

        linkedList.leave(1,21,125);
    }

 

标签:getNext,Josepfu,helper,单向,约瑟夫,Person,id,public,first
来源: https://blog.csdn.net/new_buff_007/article/details/98632743

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有