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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java模拟单链表环形链表解决约瑟夫问题

發布時間:2024/4/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java模拟单链表环形链表解决约瑟夫问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java模擬環形鏈表解決約瑟夫問題

此文是觀看尚硅谷韓老師的數據結構與算法學習視頻整理的筆記

約瑟夫問題描述

約瑟夫問題(有時也稱為約瑟夫斯置換,是一個出現在計算機科學和數學中的問題。在計算機編程的算法中,類似問題又稱為約瑟夫環。又稱“丟手絹問題”.)

Josephu(約瑟夫、約瑟夫環) 問題
Josephu 問題為:設編號為 1,2,… n 的 n 個人圍坐一圈,約定編號為 k(1<=k<=n)的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此產生一個出隊編號的序列

環形鏈表介紹

環形鏈表是另一種形式的鏈式存貯結構。它的特點是表中最后一個結點的指針域指向頭結點,整個鏈表形成一個環。

解決約瑟夫圖解問題思路

構建環形鏈表思路

解決約瑟夫問題代碼思路

代碼演示(代碼中有詳細解釋)

package com.fs.demo_2020_07_17_CircleSingleLinkedListTable; /* 環形鏈表解決約瑟夫問題*/ public class CircleSingleLinkedListTable {public static void main(String[] args) {//測試一下CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();//形成5個節點的環形鏈表 // circleSingleLinkedList.addNode(5); // circleSingleLinkedList.showNode();System.out.println("-----------測試計算約瑟夫問題----------");//測試約瑟夫問題circleSingleLinkedList.countNode(1,2,5);} }//創建一個環形的單向鏈表 class CircleSingleLinkedList{//創建一個first 節點,當前沒有編號private Node first = null;//添加一個節點,構建成一個環形的鏈表public void addNode(int nums){//先對nums進行判斷,if (nums<1){System.out.println("給定的nums的值請大于1");return;}//創建一個輔助指針,幫助構建環形鏈表Node curNode = null;//使用for來創建我們的環形鏈表for (int i = 1; i <= nums; i++) {//根據編號,來創建小孩節點Node node = new Node(i);//如果是第一個小孩,先讓自己構成環if (i==1){//先讓first指向第一個節點first = node;//然后讓第一個 節點的next指向第一個節點,形成環形first.setNext(first);//讓輔助指針也指向我們的第一個節點curNode = first;}else {//如果不是第一個節點了//就先讓輔助指針指向的節點的下一個節點為當前循環創建的nodecurNode.setNext(node);//讓當前循環創建的節點的下一個節點指向first,形成環形node.setNext(first);//最后讓輔助指針指向循環創建的新的節點curNode = node;}}}//遍歷當前的環形鏈表public void showNode(){//先判斷鏈表是否為空if (first == null){System.out.println("沒有任何節點,請給入正確的值,讓鏈表形成環形");return;}//因為first在遍歷的時候不能移動,我們還是需要使用一個輔助指針完成遍歷Node curNode = first;//先讓輔助指針指向頭指針while (true){System.out.println("當前的節點編號為:"+curNode.getNum());if (curNode.getNext() == first){//當指針移動到最后一個節點的時候,那么這個節點的下一個節點是first,所以遍歷完了break;}//否則就還有節點,那就將輔助指針移動到下一個節點curNode = curNode.getNext();}}/*** 根據用戶輸入的節點個數,解決節點出圈的循序,解決約瑟夫的問題* Josephu 問題為:設編號為 1,2,… n 的 n 個人圍坐一圈,約定編號為 k(1<=k<=n)的人從 1 開始報數,數* 到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由* 此產生一個出隊編號的序列。* @param startNum 表示從第幾個小孩開始報數* @param countNum 表示數幾下,就出列* @param nums 表示最初有多少個節點*/public void countNode(int startNum,int countNum,int nums){//創建鏈表addNode(nums);//先對數據進行校驗if (first == null || startNum < 1 || startNum > nums ){System.out.println("請正確傳入參數~~~");return;}//創建一個輔助指針curNode,事先應該指向環形鏈表最后這個節點Node curNod = first;while (true){if (curNod.getNext() == first){//說明輔助指針指向最后一個節點break;}//一直循環,直到輔助指針指向了最后一個節點curNod = curNod.getNext();}//節點因為first和curNod現在一個是指向頭節點,一個是指向最后一個節點//當對節點進行計數的時候,從那個節點開始計數,假設我要從第二個節點開始計數,// 我就需要讓first和curNod移動一位,那么就是startNum-1位for (int i = 0; i < startNum - 1; i++) {//讓first移動startNum - 1位first = first.getNext();//讓curNod移動startNum - 1位curNod = curNod.getNext();}//節點開始計數時候,讓first和curNod同時移動 countNum -1 次,然后讓first指向的節點斷開(也就是出圈)//假設從1開始數數2下就出列,那么就是2號出列因為前面first指向的是1號,while (true){if (curNod == first){//說明環形鏈表只有一個節點break;}//讓first和curNod同時移動 countNum -1 次for (int i = 0; i < countNum - 1; i++) {//移動first = first.getNext();curNod = curNod.getNext();}//這時first指向的節點,就是要出圈的節點System.out.println("當前first指向的出圈節點為:"+first.getNum());//將first指向first的下一個節點first = first.getNext();//在將輔助指針指向firstcurNod.setNext(first);}//循環完成后,那么就只有一個節點了,那樣就會自己指向自己,就是最后一個出圈System.out.println("最后一個出圈的節點為:"+first.getNum());}}//創建一個類來表示一個節點 class Node {public int num;//當前節點數public Node next;//當前節點存儲的下一個節點信息//提供構造方法來初始化這個節點信息public Node(int num) {this.num = num;}//提供get,set方法來獲取Node對象public int getNum() {return num;}public void setNum(int num) {this.num = num;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;} }

測試結果

總結

以上是生活随笔為你收集整理的java模拟单链表环形链表解决约瑟夫问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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