约瑟夫(环)问题(Josephu)(单向环形链表)
生活随笔
收集整理的這篇文章主要介紹了
约瑟夫(环)问题(Josephu)(单向环形链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
代碼實現
package com.atguigu.linkedlist;import com.sun.org.apache.bcel.internal.generic.NEW;/*** @創建人 wdl* @創建時間 2021/3/19* @描述*/ public class Josepfu {public static void main(String[] args) {//測試一把看看構建的環形鏈表和遍歷是否正確CircleSingleLinkedList circleSingleLinkedList=new CircleSingleLinkedList();circleSingleLinkedList.addBoy(125);//加入5個小孩節點circleSingleLinkedList.showBoy();//測試一把小孩出圈是否正確circleSingleLinkedList.countBoy(10,20,125);} }//創建一個環形的單向鏈表 class CircleSingleLinkedList{//創建一個first節點,當前沒有編號private Boy first=null;//添加小孩節點,構建成一個環形的鏈表public void addBoy(int nums){//nums做一個數據校驗if(nums<1){System.out.println("nums的值不正確");return;}Boy curBoy=null;//輔助指針,幫助我們構建環形鏈表//使用for來創建我們的環形鏈表for (int i = 1; i <=nums; i++) {//根據編號,創建小孩節點Boy boy=new Boy(i);//如果是第一個小孩if(i==1){first=boy;first.setNext(first);//構成環curBoy=first;//讓curBoy指向第一個小孩}else {curBoy.setNext(boy);boy.setNext(first);curBoy=boy;}}}//遍歷當前的環形鏈表public void showBoy(){//判斷鏈表是否為空if(first==null){System.out.println("沒有任何小孩");return;}//因為first不能動,因此我們仍然使用一個輔助指針完成遍歷Boy curBoy=first;while (true){System.out.println("小孩的編號"+curBoy.getNo());if (curBoy.getNext()==first){//說明已經遍歷完畢break;}curBoy=curBoy.getNext();}}//根據用戶的輸入,計算出小孩出圈的順序/**** @param startNo 表示從第幾個小孩開始數數* @param countNum 表示數幾下* @param nums 表示最初有多少個小孩在圈中*/public void countBoy(int startNo,int countNum,int nums){//先對數據進行校驗if(first==null||startNo<1||startNo>nums){System.out.println("參數輸入有誤,請重新輸入");return;}//創建一個輔助指針,幫助完成小孩出圈Boy helper=first;//需要創建一個輔助指針(變量)helper,事先應該指向環形鏈表的最后這個節點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-1次,然后出圈for (int j = 0; j < countNum - 1; j++) {first=first.getNext();helper=helper.getNext();}//這時first指向的節點,就是要出圈的小孩節點System.out.println("小孩"+first.getNo()+"出圈");//這時將first指向的節點出圈first=first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩編號"+helper.getNo());}}//創建一個Boy類,表示一個節點 class Boy{private int no;//編號private Boy next;//指向下一個節點,默認為nullpublic 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;} }總結
以上是生活随笔為你收集整理的约瑟夫(环)问题(Josephu)(单向环形链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线路由器提示dns异常,但是好像其实可
- 下一篇: 用数组模拟栈