我的Java数据结构学习-4-5---单项环形链表(约瑟夫环)

 

 

 

约瑟夫节点对象:

复制代码
package Demo1.LinkeList;

public class JosephuNode {

    //约瑟夫环路节点
    private int no;//编号
    private JosephuNode next;//指向下一个节点

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

    public int getNo() {
        return no;
    }

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

    public JosephuNode getNext() {
        return next;
    }

    public void setNext(JosephuNode next) {
        this.next = next;
    }
}
复制代码

约瑟夫环形链表对象:

复制代码
package Demo1.LinkeList;

public class JosephuLinkedList {
    //环形单项链表
    //创建一个第一个位置节点
    private JosephuNode fist = null;

    //添加节点到环形链表
    public void addJosephuLinkedNode(int nums) {
        if (nums < 1) {
            System.out.println("传入的节点数不正确。。");
            return;
        }
        JosephuNode temp = null;
        //使用for循环创建环形链表
        for (int i = 1; i <= nums; i++) {
            //根据编号创建节点
            JosephuNode node = new JosephuNode(i);
            //如果是第一个节点,他需要
            if (i == 1) {
                fist = node;
                fist.setNext(fist);//构成环
                temp = fist;//让指针指向第一个节点。
            } else {
                temp.setNext(node);
                node.setNext(fist);
                temp = node;
            }

        }
    }

    //遍历当前的环形链表
    public void printfJosephu() {
//判断链表是否为空
        if (fist == null) {
            System.out.println("没有任何节点");
            return;
        }
        JosephuNode temp = fist;
        while (true) {
            System.out.println("节点编号" + temp.getNo());
            if (temp.getNext() == fist) {
                //说明遍历完毕,
                break;
            }
            temp = temp.getNext();//指针后移
        }
    }

    //根据用户的输入,计算节点出去的顺序
    public void countJosephu(int startNum, int countNum, int nums) {
        //数据校验
        if (fist == null || startNum < 1 || startNum > nums) {
            System.out.println("参数输入有误,请仔细确认");
            return;
        }
        JosephuNode temp = fist;
        while (true) {
            if (temp.getNext() == fist) {
                break;
            }
            temp = temp.getNext();
        }
        for (int i = 0; i < startNum - 1; i++) {
            fist = fist.getNext();
            temp = temp.getNext();
        }
        while (true) {
            if (temp == fist) {
                //说明圈中只有一个系节点
                break;
            }
            for (int i = 0; i < countNum - 1; i++) {
                fist = fist.getNext();
                temp = temp.getNext();
            }
            System.out.println("出圈:"+fist.getNo());
            fist = fist.getNext();
            temp.setNext(fist);

        }
        System.out.println("最后留在圈中的编号:"+fist.getNo());
    }

}
复制代码

约瑟夫环测试:

 

复制代码
package Demo1.LinkeList;

public class JosephuLinkedListTest {
    public static void main(String[] args) {
        //测试约瑟夫
        JosephuLinkedList list = new JosephuLinkedList();
        list.addJosephuLinkedNode(5);//加入五个节点
        list.printfJosephu();
        //测试节点出圈是否正确
        list.countJosephu(1,2,5);

    }
}
复制代码

 

posted on   白嫖老郭  阅读(105)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示