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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

链表(Linked List)之环形链表

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表(Linked List)之环形链表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:傳送門

單向環(huán)形鏈表應(yīng)用場(chǎng)景

Josephu(約瑟夫、約瑟夫環(huán)) 問題

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

提示:

用一個(gè)不帶頭結(jié)點(diǎn)的循環(huán)鏈表來處理Josephu 問題:先構(gòu)成一個(gè)有n個(gè)結(jié)點(diǎn)的單循環(huán)鏈表,然后由k結(jié)點(diǎn)起從1開始計(jì)數(shù),計(jì)到m時(shí),對(duì)應(yīng)結(jié)點(diǎn)從鏈表中刪除,然后再?gòu)谋粍h除結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)又從1開始計(jì)數(shù),直到最后一個(gè)結(jié)點(diǎn)從鏈表中刪除算法結(jié)束。

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

n = 5 , 即有5個(gè)人 k = 1, 從第一個(gè)人開始報(bào)數(shù) m = 2, 數(shù)2下

構(gòu)建一個(gè)單向的環(huán)形鏈表思路

  • 先創(chuàng)建第一個(gè)節(jié)點(diǎn), 讓 first 指向該節(jié)點(diǎn),并形成環(huán)形
  • 后面當(dāng)我們每創(chuàng)建一個(gè)新的節(jié)點(diǎn),就把該節(jié)點(diǎn),加入到已有的環(huán)形鏈表中即可.
  • 遍歷環(huán)形鏈表

  • 先讓一個(gè)輔助指針(變量) curBoy,指向first節(jié)點(diǎn)
  • 然后通過一個(gè)while循環(huán)遍歷 該環(huán)形鏈表即可 curBoy.next == first 結(jié)束
  • 環(huán)形鏈表_約瑟夫問題分析圖解和實(shí)現(xiàn)

    根據(jù)用戶的輸入,生成一個(gè)小孩出圈的順序 n = 5 , 即有5個(gè)人 k = 1, 從第一個(gè)人開始報(bào)數(shù) m = 2, 數(shù)2下
  • 需求創(chuàng)建一個(gè)輔助指針(變量) helper , 事先應(yīng)該指向環(huán)形鏈表的最后這個(gè)節(jié)點(diǎn). 補(bǔ)充: 小孩報(bào)數(shù)前,先讓 first 和 helper 移動(dòng) k - 1次
  • 當(dāng)小孩報(bào)數(shù)時(shí),讓first 和 helper 指針同時(shí) 的移動(dòng) m - 1 次
  • 這時(shí)就可以將first 指向的小孩節(jié)點(diǎn) 出圈 first = first .next helper.next = first
    原來first 指向的節(jié)點(diǎn)就沒有任何引用,就會(huì)被回收
  • 出圈的順序 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) {// 測(cè)試一把看看構(gòu)建環(huán)形鏈表,和遍歷是否okCircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();circleSingleLinkedList.addBoy(125);// 加入5個(gè)小孩節(jié)點(diǎn)circleSingleLinkedList.showBoy();//測(cè)試一把小孩出圈是否正確circleSingleLinkedList.countBoy(10, 20, 125); // 2->4->1->5->3//String str = "7*2*2-5+1-5+3-3";}}// 創(chuàng)建一個(gè)環(huán)形的單向鏈表 class CircleSingleLinkedList {// 創(chuàng)建一個(gè)first節(jié)點(diǎn),當(dāng)前沒有編號(hào)private Boy first = null;// 添加小孩節(jié)點(diǎn),構(gòu)建成一個(gè)環(huán)形的鏈表public void addBoy(int nums) {// nums 做一個(gè)數(shù)據(jù)校驗(yàn)if (nums < 1) {System.out.println("nums的值不正確");return;}Boy curBoy = null; // 輔助指針,幫助構(gòu)建環(huán)形鏈表// 使用for來創(chuàng)建我們的環(huán)形鏈表for (int i = 1; i <= nums; i++) {// 根據(jù)編號(hào),創(chuàng)建小孩節(jié)點(diǎn)Boy boy = new Boy(i);// 如果是第一個(gè)小孩if (i == 1) {first = boy;first.setNext(first); // 構(gòu)成環(huán)curBoy = first; // 讓curBoy指向第一個(gè)小孩} else {curBoy.setNext(boy);//boy.setNext(first);//curBoy = boy;}}}// 遍歷當(dāng)前的環(huán)形鏈表public void showBoy() {// 判斷鏈表是否為空if (first == null) {System.out.println("沒有任何小孩~~");return;}// 因?yàn)閒irst不能動(dòng),因此我們?nèi)匀皇褂靡粋€(gè)輔助指針完成遍歷Boy curBoy = first;while (true) {System.out.printf("小孩的編號(hào) %d \n", curBoy.getNo());if (curBoy.getNext() == first) {// 說明已經(jīng)遍歷完畢break;}curBoy = curBoy.getNext(); // curBoy后移}}// 根據(jù)用戶的輸入,計(jì)算出小孩出圈的順序/**** @param startNo* 表示從第幾個(gè)小孩開始數(shù)數(shù)* @param countNum* 表示要數(shù)幾下* @param nums * 表示最初有多少小孩在圈中*/public void countBoy(int startNo, int countNum, int nums) {// 先對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)if (first == null || startNo < 1 || startNo > nums) {System.out.println("參數(shù)輸入有誤, 請(qǐng)重新輸入");return;}// 創(chuàng)建要給輔助指針,幫助完成小孩出圈Boy helper = first;// 需求創(chuàng)建一個(gè)輔助指針(變量) helper , 事先應(yīng)該指向環(huán)形鏈表的最后這個(gè)節(jié)點(diǎn)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è)節(jié)點(diǎn)while(true) {if(helper == first) { //說明圈中只有一個(gè)節(jié)點(diǎn)break;}//讓 first 和 helper 指針同時(shí) 的移動(dòng) countNum - 1for(int j = 0; j < countNum - 1; j++) {first = first.getNext();helper = helper.getNext();}//這時(shí)first指向的節(jié)點(diǎn),就是要出圈的小孩節(jié)點(diǎn)System.out.printf("小孩%d出圈\n", first.getNo());//這時(shí)將first指向的小孩節(jié)點(diǎn)出圈first = first.getNext();helper.setNext(first); //}System.out.printf("最后留在圈中的小孩編號(hào)%d \n", first.getNo());} }// 創(chuàng)建一個(gè)Boy類,表示一個(gè)節(jié)點(diǎn) class Boy {private int no;// 編號(hào)private Boy next; // 指向下一個(gè)節(jié)點(diǎn),默認(rèn)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;}}

    原文地址:傳送門

    總結(jié)

    以上是生活随笔為你收集整理的链表(Linked List)之环形链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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