鏈表(Linked List)之環形鏈表

原文地址:傳送門

單向環形鏈表應用場景

img

Josephu(約瑟夫、約瑟夫環) 問題

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

提示:

用一個不帶頭結點的循環鏈表來處理Josephu 問題:先構成一個有n個結點的單循環鏈表,然后由k結點起從1開始計數,計到m時,對應結點從鏈表中刪除,然后再從被刪除結點的下一個結點又從1開始計數,直到最后一個結點從鏈表中刪除算法結束。

img

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

n = 5 , 即有5個人 
k = 1, 從第一個人開始報數
m = 2, 數2下

img

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

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

遍歷環形鏈表

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

環形鏈表_約瑟夫問題分析圖解和實現

img

根據用戶的輸入,生成一個小孩出圈的順序
n = 5 , 即有5個人 
k = 1, 從第一個人開始報數
m = 2, 數2下
  1. 需求創建一個輔助指針(變量) helper , 事先應該指向環形鏈表的最后這個節點. 補充: 小孩報數前,先讓 firsthelper 移動 k - 1
  2. 當小孩報數時,讓firsthelper 指針同時 的移動 m - 1
  3. 這時就可以將first 指向的小孩節點 出圈 first = first .next helper.next = first
    原來first 指向的節點就沒有任何引用,就會被回收

出圈的順序 2->4->1->5->3

一直丟手絹

嗶哩嗶哩動畫

代碼

package com.atguigu.linkedlist;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-19 15:22 <br/>* @project data_algorithm* @package com.atguigu.linkedlist*/public class Josepfu {public static void main(String[] args) {// 測試一把看看構建環形鏈表,和遍歷是否okCircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(125);// 加入5個小孩節點circleSingleLinkedList.showBoy();//測試一把小孩出圈是否正確circleSingleLinkedList.countBoy(10, 20, 125); // 2->4->1->5->3//String str = "7*2*2-5+1-5+3-3";}}// 創建一個環形的單向鏈表
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.printf("小孩的編號 %d \n", curBoy.getNo());if (curBoy.getNext() == first) {// 說明已經遍歷完畢break;}curBoy = curBoy.getNext(); // curBoy后移}}// 根據用戶的輸入,計算出小孩出圈的順序/**** @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());}
}// 創建一個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;}}

原文地址:傳送門

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot 單測加入參數_spring-boot-單元測試參數數

簡單案例RunWith(Parameterized.class)public class ParameterTest {// 2.聲明變量存放預期值和測試數據private String firstName;private String lastName;//3.聲明一個返回值 為Collection的公共靜態方法&#xff0c;并使用Parameters進行修飾Parameterized.Parameterspubli…

H.264/AVC 標準中CAVLC 和CABAC 熵編碼算法研究

http://www.paper.edu.cn/index.php/default/releasepaper/downPaper/200903-146

python ==》 元組

為何要有元組 &#xff0c;() 可存放多個值 元組不可變 更多的是用來查詢t (1,[1,3],sss,(1,2)) #t tuple(1,[1,3],sss,(1,2))print (type(t))元組可以作為字典的keyd{(1,2,3):zcx}print(d,type(d),d[(1,2,3)])索引取值d (1,2,3,4,5)print(d[1])切片goods (iphone,lenove,…

免費SSL證書(支持1.0、1.1、1.2)

由于公司要開發微信小程序&#xff0c;而微信小程序的接口需要https協議的&#xff0c;并且要支持TLS1.0、TLS1.1、TLS1.2。如果僅僅是為了開發小程序&#xff0c;安全等級又不用太高&#xff0c;可以選擇免費的SSL證書 在這里選擇騰訊云的證書&#xff0c;申請在 https://cons…

viewsource和viewparsed_Network Panel說明

一、chrome Developer Tools&#xff1a;Network Panel從網絡面板中可以獲取很多有用信息&#xff0c;如詳細的時間數據&#xff0c;http請求頭響應頭&#xff0c;cookies&#xff0c;WebSocket數據。通過分析這些數據&#xff0c;可以知道哪個資源加載耗時最久&#xff0c;誰發…

使用棧來完成一個表達式的結果

原文地址:傳送門 使用棧來完成一個表達式的結果 使用棧完成計算 一個表達式的結果 7*2*2-51-53-4 &#xff1f; 32*6-2[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XzPnJzRe-1614845779689)(https://victorfengming.gitee.io/data_algorithm/i…

JM與h264標準中的關鍵字說明

有些亂&#xff0c;先存著&#xff0c;留著看 如何結合H.264標準看JM代碼》這個web文件&#xff0c;大家都應該有了吧。不過&#xff0c;那個web文檔是“H.264樂園”群中聊天的內容 1、一個sps后&#xff0c;有若干個pps嗎&#xff1f; 這主要又編碼器決定&#xff0c;但J…

云計算(cloud computing)十大問答

本文講的是云計算&#xff08;cloud computing&#xff09;十大問答&#xff0c;【IT168 資訊】云計算這個新名詞最近甚囂塵上&#xff0c;最近周圍不少朋友都在談&#xff0c;有必要寫一個關于云計算的科普了。  一般的業界比較喜歡用一些新名詞來體現 自己的戰略眼光和與對…

3150cdn打印機清零 hl_兄弟HL-3150/3140彩色打印機粉盒清零方法,我們提前了解一下...

原標題&#xff1a;兄弟HL-3150/3140彩色打印機粉盒清零方法&#xff0c;我們提前了解一下對于兄弟品牌的打印機&#xff0c;相信各位經銷商朋友都遇到過&#xff0c;更換新的粉盒或者加粉后還會提示墨粉不足、更換碳粉盒、更換硒鼓。這個情況需要在機器上操作清零&#xff01;…

Python 關于bytes類方法對數字轉換的誤區, Json的重要性

本文起源于一次犯錯, 在發覺bytes()里面可以填數字, 轉出來的也是bytes類型, 就心急把里面的東西decode出來. 結果為空.搞來搞去以為是命令不熟練事實上錯在邏輯.a1 bytes(11, encodingutf-8) print(a1)b1 a1.decode()print(b1)a2 bytes(11) print(a2)b2 a2.decode() print…

前綴中綴后綴表達式的計算求值

原文在這里 表達式 前綴表達式(波蘭表達式) 前綴表達式又稱波蘭式,前綴表達式的運算符位于操作數之前舉例說明&#xff1a; (34)5-6 對應的前綴表達式就是 - 3 4 5 6 前綴表達式求值 前綴表達式的計算機求值 從右至左掃描表達式&#xff0c;遇到數字時&#xff0c;將數…

psnr 計算

PSNR是“Peak Signal to Noise Ratio”的縮寫&#xff0c;峰值信噪比。psnr一般是用于最大值信號和背景噪音之間的一個工程項目。 PSNR計算公式如下&#xff1a; 8bits表示法中&#xff0c;peak的最大值為255&#xff1b;MSE指Mean Square Error&#xff08;均方誤差&#xff0…

光源時間_縮短背光源的使用壽命的原因

許多場所都會使用到led這種產品&#xff0c;這種產品經常用于背光的照亮中。但是由于使用led的局限性較大&#xff0c;所以led逐漸被背光源這種產品所代替&#xff0c;常常用于背景的照亮讓宣傳圖可以展現出更好的視覺&#xff0c;這也是許多人選擇背光源的原因。那么&#xff…

《結對-貪吃蛇-需求分析》

結對編程&#xff1a;貪吃蛇項目 準備階段&#xff1a;安裝Python、pygame 編寫階段&#xff1a;1. 設置游戲窗口 2. 設置游戲必要功能&#xff1a; a)開始、暫停、退出按鈕 b)貪吃蛇身體 c)食物 d)移動貪吃蛇所需按鍵 3. 完善游戲&#xff1a;添加游戲時間、貪吃蛇失敗次數…

視頻中場的問題2009-04-03 19:38(一)

視頻中場的問題2009-04-03 19:38(一) 場的用途&#xff1a; 讓25幀/秒的電視畫面幀速率&#xff0c;變為50幀/秒。使觀眾感受到更加流暢的畫面。 (二) 場的由來&#xff1a; 在電視制作的時候&#xff0c;電視掃描一副畫面的時間根據當地交流電源的頻率來確定。比如中國交流電源…

遞歸應用場景和調用機制

原文鏈接:傳送門 遞歸 迷宮問題(回溯) 概念 簡單吶的說: 遞歸就是方法自己調用自己,每次調用時傳入不同的變量,遞歸有助于編程者解決復雜的問題,同時讓代碼變得簡潔. 案例-遞歸調用機制 打印問題 public static void test(int n){if(n>2){test(n-1);}System.out.print…

在vivado里用rtl描述_如何利用Vivado HLS處理許多位準確或任意精度數據類型

我們在設計硬件時&#xff0c;它往往是要求更精確的位寬。例如&#xff0c;一個filter的輸入是12位和一個累加器的結果只需要一個最大范圍為27位。然而對于硬件設計來說&#xff0c;使用標準的C數據類型會造成硬件成本的浪費。這就會造成我們要使用更多的LUT和寄存器&#xff0…

Spring4.0之四:Meta Annotation(元注解)

Spring框架自2.0開始添加注解的支持&#xff0c;之后的每個版本都增加了更多的注解支持。注解為依賴注入&#xff0c;AOP&#xff08;如事務&#xff09;提供了更強大和簡便的方式。這也導致你要是用一個相同的注解到許多不同的類中去。這篇文章介紹meta annotation來解決這個問…

八皇后問題分析與Java實現

原文鏈接:傳送門 八皇后問題 八皇后問題&#xff0c;是一個古老而著名的問題&#xff0c;是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯貝瑟爾于1848年提出&#xff1a;在88格的國際象棋上擺放八個皇后&#xff0c;使其不能互相攻擊&#xff0c;即&#xff1a;任意兩個…

各種音視頻編解碼學習詳解 h264 ,mpeg4 ,aac 等所有音視頻格式

編解碼學習筆記&#xff08;一&#xff09;&#xff1a;基本概念 媒體業務是網絡的主要業務之間。尤其移動互聯網業務的興起&#xff0c;在運營商和應用開發商中&#xff0c;媒體業務份量極重&#xff0c;其中媒體的編解碼服務涉及需求分析、應用開發、釋放license收費等等。最…