日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 - 链表(单向环形链表)(约瑟夫问题)

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 链表(单向环形链表)(约瑟夫问题) 小編覺得挺不錯(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。