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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单向环形列表及应用场景(约瑟夫环)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单向环形列表及应用场景(约瑟夫环) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、環形列表:

二、構建一個單向的環形鏈表思路

1.先創建第一個節點讓first指向該節點,并形成環形
2.后面當我們每創建一個新的節點,就把該節點,加入到己有的環形鏈表中即可

三、遍歷環形鏈表

1.先讓一個輔助指針(變量)curBoy,指向first節點
2.然后通過一個while循環遍歷該環形鏈表即可curBoy.next==first結束

四、環形列表節點類:

// 創建一個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;} }

五、約瑟夫環問題:

六、約瑟夫環解決類(環形列表類):

插入環形列表節點:

  • 1.插入節點
// 添加小孩節點,構建成一個環形的鏈表,nums為參加游戲的人數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;}}}
  • 2.刪除節點(出圈):
// 根據用戶的輸入,計算出小孩出圈的順序/*** @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 - 1for(int j = 0; j < countNum - 1; j++) {first = first.getNext();helper = helper.getNext();}//這時first指向的節點,就是要出圈的小孩節點System.out.printf("小孩%d出圈\n", first.getNo());//這時將first指向的小孩節點出圈first = first.getNext();helper.setNext(first); }System.out.printf("最后留在圈中的小孩編號%d \n", first.getNo());}

總結

以上是生活随笔為你收集整理的单向环形列表及应用场景(约瑟夫环)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。