数据结构 - 链表(单向环形链表)(约瑟夫问题)
生活随笔
收集整理的這篇文章主要介紹了
数据结构 - 链表(单向环形链表)(约瑟夫问题)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問題如下(與分析)
構(gòu)建思路
輸入一個(gè)數(shù),數(shù)到這個(gè)數(shù)的小孩出圈,出圈順序的思路
代碼實(shí)現(xiàn)
根據(jù)圖解,來一步一步實(shí)現(xiàn)
//根據(jù)用戶輸入,計(jì)算小孩出圈順序/**** @param startNo 表示從第幾個(gè)小孩開始數(shù)數(shù)* @param countNum 表示數(shù)幾下出圈* @param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先對數(shù)據(jù)校驗(yàn)if (first == null || startNo<1 || startNo > nums){System.out.println("輸入有誤,重新輸入");return;}//創(chuàng)建輔助指針,幫助出圈Boy helper = first;while (true){if (helper.getNext() == first){ //說明helper指向最后小孩節(jié)點(diǎn)break;}helper = helper.getNext();}//小孩報(bào)數(shù)前,先讓first 和 helper 移動(dòng) k - 1 次for (int j = 0; j < startNo -1; j++){first = first.getNext();helper = helper.getNext();}//當(dāng)小孩報(bào)數(shù)時(shí),讓first 和 helper 指針同時(shí) 移動(dòng) m - 1 次,然后出圈//這里是一個(gè)循環(huán)操作,直到圈中只有一個(gè)小孩while (true){if (helper == first){ //說明只有一個(gè)節(jié)點(diǎn)break;}//讓first 和 helper 同時(shí)移動(dòng) countNum - 1for (int i = 0; i < countNum -1; i++){first = first.getNext();helper = helper.getNext();}//這時(shí)first指向的節(jié)點(diǎn),就是要出圈的節(jié)點(diǎn)System.out.printf("小孩 %d 出圈\n",first.getNo());//出圈(刪除first指向的節(jié)點(diǎn))first = first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩編號:"+first.getNo());} }測試
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五個(gè)小孩節(jié)點(diǎn)//測試小孩出圈 circleSingleLinkedList.countBoy(1,2,5);結(jié)果: 小孩 2 出圈 小孩 4 出圈 小孩 1 出圈 小孩 5 出圈 最后留在圈中的小孩編號:3完整代碼
package DataStructures.LinkedList;/*** 約瑟夫問題*/ public class Josepfu {public static void main(String []args){CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(5); //加入五個(gè)小孩節(jié)點(diǎn)//遍歷//circleSingleLinkedList.showBoy();//測試小孩出圈circleSingleLinkedList.countBoy(1,2,5);} } //創(chuàng)建一個(gè)環(huán)形單向鏈表 class CircleSingleLinkedList{//創(chuàng)建一個(gè)first節(jié)點(diǎn),當(dāng)前沒有編號private Boy first = null;//遍歷環(huán)形鏈表public void showBoy(){//先判斷是否為空if (first == null){System.out.println("鏈表為空");return;}//因?yàn)閒irst不能動(dòng),要用輔助指針完成遍歷Boy cur = first;while (true){System.out.printf("小孩的編號是:%d \n",cur.getNo());if (cur.getNext() == first){ //遍歷完break;}cur = cur.getNext(); //后移}}//添加小孩節(jié)點(diǎn),構(gòu)建環(huán)形鏈表public void addBoy(int nums){//驗(yàn)證numsif (nums<1){System.out.println("nums的值不正確");return;}Boy cur = null; //輔助指針幫助構(gòu)建環(huán)形鏈表//使用for來構(gòu)建環(huán)形鏈表for (int i = 1; i <= nums; i++){//根據(jù)編號創(chuàng)建小孩節(jié)點(diǎn)Boy boy = new Boy(i);//如果是第一個(gè)小孩if (i == 1){first = boy;first.setNext(first); //構(gòu)成一個(gè)環(huán)cur = first; //讓cur指向第一個(gè)小孩,first不能動(dòng)} else {cur.setNext(boy);boy.setNext(first);cur = boy;}}}//根據(jù)用戶輸入,計(jì)算小孩出圈順序/**** @param startNo 表示從第幾個(gè)小孩開始數(shù)數(shù)* @param countNum 表示數(shù)幾下出圈* @param nums 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums){//先對數(shù)據(jù)校驗(yàn)if (first == null || startNo<1 || startNo > nums){System.out.println("輸入有誤,重新輸入");return;}//創(chuàng)建輔助指針,幫助出圈Boy helper = first;while (true){if (helper.getNext() == first){ //說明helper指向最后小孩節(jié)點(diǎn)break;}helper = helper.getNext();}//小孩報(bào)數(shù)前,先讓first 和 helper 移動(dòng) k - 1 次for (int j = 0; j < startNo -1; j++){first = first.getNext();helper = helper.getNext();}//當(dāng)小孩報(bào)數(shù)時(shí),讓first 和 helper 指針同時(shí) 移動(dòng) m - 1 次,然后出圈//這里是一個(gè)循環(huán)操作,直到圈中只有一個(gè)小孩while (true){if (helper == first){ //說明只有一個(gè)節(jié)點(diǎn)break;}//讓first 和 helper 同時(shí)移動(dòng) countNum - 1for (int i = 0; i < countNum -1; i++){first = first.getNext();helper = helper.getNext();}//這時(shí)first指向的節(jié)點(diǎn),就是要出圈的節(jié)點(diǎn)System.out.printf("小孩 %d 出圈\n",first.getNo());//出圈(刪除first指向的節(jié)點(diǎn))first = first.getNext();helper.setNext(first);}System.out.println("最后留在圈中的小孩編號:"+first.getNo());} } //先創(chuàng)建一個(gè)Boy類,表示一個(gè)節(jié)點(diǎn) 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;} }總結(jié)
以上是生活随笔為你收集整理的数据结构 - 链表(单向环形链表)(约瑟夫问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《EVA新剧场版》主题高跟鞋:优雅华丽更
- 下一篇: springCloud五大组件--Eur