當(dāng)前位置:
首頁(yè) >
数据结构之单向环形列表解决josef问题
發(fā)布時(shí)間:2023/12/10
33
豆豆
生活随笔
收集整理的這篇文章主要介紹了
数据结构之单向环形列表解决josef问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.定義節(jié)點(diǎn)類
?? 該節(jié)點(diǎn)類中只有孩子的編號(hào),以及指向下一個(gè)節(jié)點(diǎn)的"指針"
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-17 22:21* 表示節(jié)點(diǎn)的類*/ public class Boy {private int no;private Boy next; //指向下一個(gè)節(jié)點(diǎn)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;}@Overridepublic String toString() {return "我是第" + no + "個(gè)Boy";}}
2.定義單向鏈表類
?? 需要注意的是,josef問(wèn)題是頭尾相連的,在這也就是最后一個(gè)節(jié)點(diǎn)需要指向第一個(gè)節(jié)點(diǎn),如果只有一個(gè)節(jié)點(diǎn),那么該節(jié)點(diǎn)需要指向節(jié)點(diǎn)本身.
?? 解決josef問(wèn)題,關(guān)鍵是理解最后的josef方法.
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-17 22:16* 環(huán)形單項(xiàng)鏈表*/ public class SingleCircleList {//創(chuàng)建一個(gè)first 節(jié)點(diǎn) 沒(méi)有編號(hào)也可以為空private Boy firstBoy =new Boy(-1);//添加節(jié)點(diǎn),構(gòu)成環(huán)形鏈表 需要注意的是第一個(gè)節(jié)點(diǎn)需要指向節(jié)點(diǎn)本身public void add(int num){if (num < 1 ){System.out.println("編號(hào)不正確");return;}//創(chuàng)建輔助節(jié)點(diǎn)Boy temp=null;//添加節(jié)點(diǎn)for (int i = 1; i <=num ; i++) {Boy boy = new Boy(i);if (i == 1){ //代表第一個(gè)節(jié)點(diǎn)firstBoy=boy;firstBoy.setNext(firstBoy);temp=firstBoy; //輔助接點(diǎn)}else {temp.setNext(boy);boy.setNext(firstBoy); //這里不能為temp 因?yàn)槭黔h(huán)形鏈表,后面逐漸增加的節(jié)點(diǎn)的next應(yīng)該是頭節(jié)點(diǎn)temp=boy;}}}//遍歷環(huán)形鏈表public void list( ){if (firstBoy.getNo() == -1){System.out.println("該環(huán)形鏈表為空!");return;}//定義輔助指針Boy temp=firstBoy;while (true){System.out.println(temp);if (temp.getNext().getNo() == 1){break;}temp=temp.getNext();}}/*josepfu問(wèn)題的實(shí)現(xiàn)根據(jù)用戶的輸入,生成小孩出圈的順序k:從哪里開(kāi)始m:數(shù)幾下num:玩游戲的小孩的數(shù)量*/public void josepfu(int k,int m,int num){//數(shù)據(jù)校驗(yàn)if (k>num || k<1 || m<1 || num<1){System.out.println("參數(shù)輸入有誤");}if(firstBoy.getNo() == -1){System.out.println("鏈表節(jié)點(diǎn)為空!");}//創(chuàng)建輔助指針 幫助小孩完成出圈Boy temp=firstBoy;//循環(huán)遍歷,將該輔助指針指向最后一個(gè),即firstBoy前一個(gè)while (true){if(temp.getNext() == firstBoy){break;}temp=temp.getNext();}// 報(bào)數(shù)之前.讓first 和temp移動(dòng)到對(duì)應(yīng)位置 在k處報(bào)數(shù),讓first和temp移動(dòng)k-1,// 移動(dòng)到開(kāi)始報(bào)數(shù)的孩子身上for (int i = 1; i <=k-1 ; i++) {firstBoy=firstBoy.getNext();temp=temp.getNext();}while (true){if (firstBoy == temp){break;}//開(kāi)始報(bào)數(shù),第k個(gè)孩子,即firstBoy當(dāng)前指向的孩子//報(bào)m個(gè)數(shù),,從第k個(gè)孩子本身報(bào)數(shù),所以firstBoy移動(dòng)m-1次,temp也移動(dòng)m-1次for (int i = 1; i <=m-1 ; i++) {firstBoy=firstBoy.getNext();temp=temp.getNext();}//上面循環(huán)結(jié)束時(shí),firstBoy指向要出去的孩子System.out.printf("小孩%d出圈",firstBoy.getNo());//這是將firstBoy指向?qū)⒁鋈サ暮⒆拥南乱晃?并且temp的next指向他firstBoy=firstBoy.getNext();temp.setNext(firstBoy);}System.out.printf("最后留在圈中的小孩編號(hào)%d",firstBoy.getNo()); //或者temp }}3. 寫一個(gè)簡(jiǎn)單測(cè)試類
package com.ebiz.list.josepfu;/*** @author YHj* @create 2019-07-18 9:30*/ public class Test {public static void main(String[] args) {//創(chuàng)建環(huán)形鏈表SingleCircleList circleList = new SingleCircleList();//環(huán)形鏈表添加節(jié)點(diǎn)circleList.add(5);//遍歷鏈表 circleList.list();circleList.josepfu(1,2,5);} }?
有不懂的歡迎留言評(píng)論!
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11224328.html
總結(jié)
以上是生活随笔為你收集整理的数据结构之单向环形列表解决josef问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android自定义渐变色,Androi
- 下一篇: 黑盒测试用例设计方法