数据结构算法爬坑日记三

约瑟夫环的解决

问题描述:有m个人围成一个圈,指定从第n个人开始依次报数,每报到K时的人出列,然后出列后面的人从1继续报数,
无限循环直到剩下一个人为止

 ** 代码实现(以环形链表方式)
 ** 节点类
 //节点类
public class Node {
    int id;
    Node next;

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

** 环形链表类
//环形链表
public class RoundLinkedList {
    private Node first;//指向第一个节点
    //创建一个环形链表
    public void createJosephRound(int count){
        if(count<1){
            System.out.println("个数需要大于0");
            return;
        }
        Node current=null;//辅助指针,指向当前节点
        for (int i = 1; i <=count; i++) {
            Node node=new Node(i);
            //如果是第一个节点,首尾相连形成环
            if(i==1){
                first=node;
                first.next=first;
                current=first;
            }else {
                //将辅助指针指向新节点,然后新节点与头节点相连
                current.next=node;
                node.next=first;
                current=node;
            }
        }
    }
    //显示所有节点
    public void show(){
        if(first==null){
            System.out.println("没有数据");
            return;
        }
        Node current=first; // 辅助指针,指向当前节点
        while (true){
            System.out.println("当前节点id "+current.id);
            // 当前节点的下一个节点如果等于最初节点,结束循环
            if(current.next==first){
                break;
            }
            current=current.next;
        }
    }
    //约瑟夫环的解决
    //start 从第几个开始 step 每次数几个 count 总共有几个
    public void Joseph(int start,int step,int count){
        if(step<1||start<1||start>count||first==null){
            System.out.println("数据有误");
            return;
        }
        Node current=first; // 辅助指针,指向当前节点的前一个
        while (current.next != first) {
            current = current.next;
        }
        // 将current和first移动到开始数的位置
        // 使用first指向开始的第一个位置,current指向开始的前一个位置
        for (int i = 0; i < start-1; i++) {
            first=first.next;
            current=current.next;
        }
        //只剩一个时,结束
        while (current != first) {
            for (int i = 0; i < step - 1; i++) {
                first = first.next;
                current = current.next;
            }
            //使当前节点的前一个指向当前节点的后一个,当前节点出列
            System.out.println("编号为" + first.id + "出列");
            first = first.next;
            current.next = first;
        }
        System.out.println("剩下的节点id为 "+first.id);
    }
}

 ** 测试类
 public class RoundLinkedListTest {
    public static void main(String[] args) {
        RoundLinkedList round=new RoundLinkedList();
        round.createJosephRound(5);
        round.show();
        round.Joseph(1,2,5);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值