java环形链表约瑟夫环问题笔记

本文探讨了经典的约瑟夫环问题,并介绍了如何利用Java和循环链表来解决这个问题。通过从编号k的人开始报数,每数到m的人出列,直到所有参与者都出列,产生了一个特定的出列序列。
摘要由CSDN通过智能技术生成

约瑟夫环问题
设编号1,2,3…n的n个人围坐一圈,从编号为k的人从1开始报数,数到m的人出列。他的下一位继续从1开始报数,数到m的人出列,以此类推,直到所有人出列位置,由此产生一个出队编号的序列。
使用不带头结点的循环链表处理该问题、

package f1;

public class g1{
		public static void main (String []args) {
	// n=5 五个人 k=1从第一个人开始报数  m=2数两下
			CircleSingleLinkedList List = new CircleSingleLinkedList();
			List.addnode(8);
			List.ysf(1, 2);
		}
}     
class CircleSingleLinkedList{
	private node first =new node(-1);  //头结点 
	public void addnode(int num) {
		//创建num个节点的环形链表
		node temp,curnode=first;
		for(int i=0; i<num;i ++) {
			temp = new node(i+1);
			curnode.next = temp;
			temp.next = first;
			curnode = temp;
		}
	}
	public void showlist() {
		node temp = first ;
		while(true) {
			if(temp.next == first) break;
			temp = temp.next ;
			System.out.println(temp.No);
		}
	}
	public void ysf(int k,int m) {
			node temp = first,helper=null; 
			int u=m;
			while(k-- > 0) {
				helper  = temp;
				temp = temp.next;
			}
			while(true) {
				if(temp == helper){
					//System.out.println(temp.No);
					break;
				}
				while(m-- > 0) {
					helper  = temp;
					temp = temp.next;
					if(temp == first) {
						helper  = temp;
						temp = temp.next;
					}
				}
				m=u;
				if(temp.No != -1)
				System.out.println(temp.No);
				helper.next = temp.next;
			}
	}
}
//创建第一个节点,让first指向该节点
//没创建新的节点就把该节点加入到已有的环形链表中
class node{
	public int No;
	public node next;
	public node(int no) {
		this.No = no;
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值