ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java学习 使用循环链表解决约瑟夫问题

2020-11-29 20:32:10  阅读:201  来源: 互联网

标签:getNext Boy java no int 约瑟夫 链表 public first


public class Josefu {

	public static void main(String[] args) {
		CirSingleLinked cir = new CirSingleLinked();
		//500个小孩
		cir.addBoy(500);
		//从第一个开始数,每数到3,出圈
		cir.countBoy(1, 3, 500);
		
	}

}

class CirSingleLinked {
	private Boy first = null;

	public boolean isEmpty() {
		return first == null;
	}

	public void list() {
		if (isEmpty()) {
			System.out.println("链表为空!");
			return;
		}

		Boy curBoy = first;

		while (true) {
			System.out.println(curBoy);
			if (curBoy.getNext() == first)
				break;
			curBoy = curBoy.getNext();
		}

	}

	// 添加小孩节点
	public void addBoy(int nums) {
		if (nums < 1) {
			System.out.println("请输入大于0的数");
			return;
		}

		// 辅助指针,帮助构建环形链表
		Boy curBoy = null;
		for (int i = 1; i <= nums; i++) {
			if (i == 1) {
				// 第一个结点next指向自己
				first = new Boy(i);
				first.setNext(first);
				curBoy = first;
				continue;
			}
			// 生成新的Boy结点
			Boy newBoy = new Boy(i);
			curBoy.setNext(newBoy);
			newBoy.setNext(first);
			curBoy = newBoy;

		}
	}

	/**
	 * 需创建一个辅助指针来进行出圈 
	 * @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;
		}
		//first 指向startNo小孩 移动 startNo-1次
		for (int i = 1; i < startNo; i++) {
			first = first.getNext(); 
		}
		
		//出圈
		//循环操作 直到圈中只有一个结点
		while(true) {
			if(first.getNext() == first) break;
			//小孩报数时, first移动到要删除的小孩前一位值,然后删除
			for(int i = 1; i< countNum -1 ;i++) {
				first = first.getNext();
				
			}
			
			System.out.println(first.getNext());
			first.setNext(first.getNext().getNext());
			first = first.getNext();

		}
		System.out.println(first);
	}
	
}

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;
	}

	@Override
	public String toString() {
		return "Boy [no=" + no + "]";
	}

}

标签:getNext,Boy,java,no,int,约瑟夫,链表,public,first
来源: https://blog.csdn.net/m0_47621042/article/details/110352399

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有