单向环形链表
Posted bingbug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单向环形链表相关的知识,希望对你有一定的参考价值。
单向环形链表(Josepfu)
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1报数,报到m时停止报数,报m的那个人出列,他的密码作为新的m值,从他在顺时针方向上的下一个人又开始重新从1报数,报到m的那个人出列又出列;依此规律重复下去,直到圆桌周围的人全部出列
/* 约瑟夫问题 */ public class Josepfu { public static void main(String[] args) { //测试 CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circleSingleLinkedList.addBoy(5); // circleSingleLinkedList.showBoy(); circleSingleLinkedList.countBoy(1,2,5); } } class CircleSingleLinkedList { private Boy first = null; public void addBoy(int nums) { if (nums < 1) { System.out.println("nums不正确"); return; } Boy curBoy = null; for (int i = 1; i <= nums; i++) { Boy boy = new Boy(i); if (i == 1) { first = boy; first.setNext(first); curBoy = first; } else { curBoy.setNext(boy); boy.setNext(first); curBoy = boy; } } } public void showBoy() { if (first == null) { System.out.println("链表为空"); return; } Boy curBoy = first; while (true) { System.out.printf("编号 %d ", curBoy.getNo()); if (curBoy.getNext() == first) { break; } curBoy = curBoy.getNext(); } } //根据输入计算出圈顺序(不包括创建链表) public void countBoy(int startNo, int countNum, int nums) { if (first == null || startNo < 1 || startNo > nums) { System.out.println("输入错误"); return; } Boy helper = first; while (true) { if (helper.getNext() == first) { break; } helper = helper.getNext(); } for (int j = 0; j < startNo - 1; j++){ first = first.getNext(); helper = helper.getNext(); } while (true){ //圈中只有一人 if (helper == first){ break; } for(int j = 0; j<countNum-1;j++){ first = first.getNext(); helper = helper.getNext(); } System.out.printf("编号 %d 出圈 ",first.getNo()); first = first.getNext(); helper.setNext(first); } System.out.printf("编号 %d 出圈",first.getNo()); } } class Boy { private int no; private Boy next; 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; } }
以上是关于单向环形链表的主要内容,如果未能解决你的问题,请参考以下文章