Java环形链表(约瑟夫环)

本文介绍了Java中如何解决约瑟夫环问题,详细阐述了环形链表的概念,并提供了添加数据和输出出列数据的步骤。通过设定报数起点和报数上限,模拟环形链表中节点按顺序出列的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

什么是环形链表

一、解决思路

二、使用步骤

1.添加数据

2. 输出出列的数据



什么是环形链表

 环形链表就是最后一个节点的next域指向了头结点的数据 从而形成了一个环本质其实还是单向链表

Josephu 问题

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


 

提示:以下是本篇文章正文内容,下面案例可供参考

一、解决思路

添加元素

1.环形链表我们可以不用使用头结点

2.使用一个first记录一个数据对象

3.定义一个临时节点 保存frist节点

3.添加的数据的next要指向first

输出出列的数据

1.判断first节点是否为空

2.利用循环遍历步数 总步数少一步  因为在的那个节点也算一个数

3如果 现在已经走的步数+1 == 要走的步数 那么下一个节点就是要出列的数据 我们就使用first.next输出下一个节点

4.让first指向下一个节点

5.如果first和下一个节点节点相同 表示只剩最后一个数据了 那么break; 输出最后一个数据

二、使用步骤

1.添加数据

    CircleNode first =new CircleNode();
    public void add(int sum){

        for (int i = 1; i <= sum; i++) {
            CircleNode node = new CircleNode(i);
            if (i==1){
                first=node;
                first.next=first;
            }else {
                CircleNode temp=first;
                while (temp.next!=first){
                    temp=temp.next;
                }
                temp.next=node;
                node.next=first;
                temp=first;
        }
        }
    }

2. 输出出列的数据

    public void jj(int satr,int m){
  

       while (first!=null){

           for (int i = 1; i <m ; i++) {
               if ((i+1)==m){
                   System.out.println(first.next);
                   first.next=first.next.next;
               }
               first = first.next;
           }

           if (first==first.next){
               break;
           }
       }
        System.out.println("最后出圈的小孩是:"+first);


    }