新公司做网站怎么弄,成都微信网站建设推,创新网站设计,带数据库的网站怎么建问题如下#xff08;与分析#xff09; 构建思路 输入一个数#xff0c;数到这个数的小孩出圈#xff0c;出圈顺序的思路 代码实现
根据图解#xff0c;来一步一步实现 //根据用户输入#xff0c;计算小孩出圈顺序/**** param startNo 表示从第几个小孩开始数数* param …问题如下与分析 构建思路 输入一个数数到这个数的小孩出圈出圈顺序的思路 代码实现
根据图解来一步一步实现 //根据用户输入计算小孩出圈顺序/**** param startNo 表示从第几个小孩开始数数* param countNum 表示数几下出圈* param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先对数据校验if (first null || startNo1 || startNo nums){System.out.println(输入有误,重新输入);return;}//创建辅助指针帮助出圈Boy helper first;while (true){if (helper.getNext() first){ //说明helper指向最后小孩节点break;}helper helper.getNext();}//小孩报数前先让first 和 helper 移动 k - 1 次for (int j 0; j startNo -1; j){first first.getNext();helper helper.getNext();}//当小孩报数时让first 和 helper 指针同时 移动 m - 1 次然后出圈//这里是一个循环操作直到圈中只有一个小孩while (true){if (helper first){ //说明只有一个节点break;}//让first 和 helper 同时移动 countNum - 1for (int i 0; i countNum -1; i){first first.getNext();helper helper.getNext();}//这时first指向的节点就是要出圈的节点System.out.printf(小孩 %d 出圈\n,first.getNo());//出圈删除first指向的节点first first.getNext();helper.setNext(first);}System.out.println(最后留在圈中的小孩编号first.getNo());}
}测试
CircleSingleLinkedList circleSingleLinkedList new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五个小孩节点//测试小孩出圈
circleSingleLinkedList.countBoy(1,2,5);结果
小孩 2 出圈
小孩 4 出圈
小孩 1 出圈
小孩 5 出圈
最后留在圈中的小孩编号3完整代码
package DataStructures.LinkedList;/*** 约瑟夫问题*/
public class Josepfu {public static void main(String []args){CircleSingleLinkedList circleSingleLinkedList new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五个小孩节点//遍历//circleSingleLinkedList.showBoy();//测试小孩出圈circleSingleLinkedList.countBoy(1,2,5);}
}
//创建一个环形单向链表
class CircleSingleLinkedList{//创建一个first节点当前没有编号private Boy first null;//遍历环形链表public void showBoy(){//先判断是否为空if (first null){System.out.println(链表为空);return;}//因为first不能动要用辅助指针完成遍历Boy cur first;while (true){System.out.printf(小孩的编号是%d \n,cur.getNo());if (cur.getNext() first){ //遍历完break;}cur cur.getNext(); //后移}}//添加小孩节点构建环形链表public void addBoy(int nums){//验证numsif (nums1){System.out.println(nums的值不正确);return;}Boy cur null; //辅助指针帮助构建环形链表//使用for来构建环形链表for (int i 1; i nums; i){//根据编号创建小孩节点Boy boy new Boy(i);//如果是第一个小孩if (i 1){first boy;first.setNext(first); //构成一个环cur first; //让cur指向第一个小孩first不能动} else {cur.setNext(boy);boy.setNext(first);cur boy;}}}//根据用户输入计算小孩出圈顺序/**** param startNo 表示从第几个小孩开始数数* param countNum 表示数几下出圈* param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先对数据校验if (first null || startNo1 || startNo nums){System.out.println(输入有误,重新输入);return;}//创建辅助指针帮助出圈Boy helper first;while (true){if (helper.getNext() first){ //说明helper指向最后小孩节点break;}helper helper.getNext();}//小孩报数前先让first 和 helper 移动 k - 1 次for (int j 0; j startNo -1; j){first first.getNext();helper helper.getNext();}//当小孩报数时让first 和 helper 指针同时 移动 m - 1 次然后出圈//这里是一个循环操作直到圈中只有一个小孩while (true){if (helper first){ //说明只有一个节点break;}//让first 和 helper 同时移动 countNum - 1for (int i 0; i countNum -1; i){first first.getNext();helper helper.getNext();}//这时first指向的节点就是要出圈的节点System.out.printf(小孩 %d 出圈\n,first.getNo());//出圈删除first指向的节点first first.getNext();helper.setNext(first);}System.out.println(最后留在圈中的小孩编号first.getNo());}
}
//先创建一个Boy类表示一个节点
class Boy{private int no;private Boy next;public Boy(int no){this.no no;}public int getNo() {return no;}public void setNo(int no) {this.no no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next next;}
}