约瑟夫环问题 链表和递归解法

数据与集合解法请看
https://blog.csdn.net/m0_51283856/article/details/111166914

链表解法

public class Node {
	//创建结点,结点数据就为会员id
	int id;
	Node next;
	
	public Node() {
		
	}
	public Node(int id) {
		this.id = id;
	}
}
public static void count(int n) {
		//计数用
		int k = 3;
		//生成头结点,头结点没有数据
		Node head = new Node();
		//辅助指针,指向当前,现在还没有形成链表,让其指向头部
		Node cur = head;
		//构造链表
		for (int i = 1; i <= n; i++) {
			//循环创建结点
			Node node = new Node(i);
			//上个结点指向新创建的结点
			//假如这里是第一轮的话,刚才cur就是head头结点,现在让其指向刚创建的1号结点
			cur.next = node;
			//新创建的结点赋给当前结点
			cur = node;
		}
		//链表创建完以后,cur就是最后一个结点,现在让其指向头部指向的那个结点也就是第一个结点形成环状
		cur.next = head.next;
		//head 结点是没有数据的,所有开始时候从head.next()结点开始
		Node p = head.next;
		//当p等于p的时候,链表里就剩一个结点了 结束循环
		while(p.next != p) {
		for(int i = 1;i < k - 1; i++) {
			p = p.next; //报数12时候p指向下一个
		}
		//这里淘汰一个
		p.next = p.next.next;
		p = p.next; // p两个next后给了p
	}
		System.out.println(p.id);
	}
	
	public static void main(String[] args) {
		count(10);
	}
	

递归解法

int f(int n, int m){
    if(n == 1)   return n;
    return (f(n - 1, m) + m - 1) % n + 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值