0
点赞
收藏
分享

微信扫一扫

【2022刷题】约瑟夫环

闲嫌咸贤 2022-03-12 阅读 56

解题思路
利用循环链表来模拟即可

  • 循环链表结点定义,初始化,删除并输出结点函数(由于该题只用到这些函数)
	static class Node{
		int value;
		Node next;

	}
	
	static void init(Node node,int n){
		Node head = node;
		head.value = 1;
		head.next = null;
		Node p = head;

		for(int i = 2; i <= n; i++){
			Node q = new Node();
			q.value = i;
			q.next = p.next;
			p.next = q;
			p = q;
			if(i==n){
				p.next = head;
			}
		}
	}

	static int out(Node pre,Node aft){
		pre.next = aft.next;
		return aft.value;
	}
  • 模拟过程,先定位在数数,一定要分清循环的次数
		for(int i = 0; i < k-1;i++){
			people = people.next;
		}
		while(people.value != people.next.value){
			for(int i = 0;i < m-2;i++){//-2是因为包括自己本身开始数以及要得到目标节点的前驱结点才好删除
				people = people.next;
			}
			System.out.println(out(people,people.next));
			people = people.next;
		}
		System.out.print(people.value);
  • 总的代码
import java.util.*;

public class Main {
	static class Node{
		int value;
		Node next;

	}
    public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int n = scan.nextInt(),k = scan.nextInt(),m = scan.nextInt();//这里一定要这样赋值不然会有奇怪的错误,例如超时
		Node people = new Node();
		init(people,n);

		for(int i = 0; i < k-1;i++){
			people = people.next;
		}
		
		while(people.value != people.next.value){
			for(int i = 0;i < m-2;i++){//-2是因为包括自己本身开始数以及要得到目标节点的前驱结点才好删除
				people = people.next;
			}
			System.out.println(out(people,people.next));
			people = people.next;
		}
		System.out.print(people.value);
        scan.close();
    }

	static void init(Node node,int n){
		Node head = node;
		head.value = 1;
		head.next = null;
		Node p = head;

		for(int i = 2; i <= n; i++){
			Node q = new Node();
			q.value = i;
			q.next = p.next;
			p.next = q;
			p = q;
			if(i==n){
				p.next = head;
			}
		}
	}

	static int out(Node pre,Node aft){
		pre.next = aft.next;
		return aft.value;
	}
}
举报

相关推荐

约瑟夫环-算法题

A - 约瑟夫环

(约瑟夫环)

约瑟夫环

链表:约瑟夫环

约瑟夫环问题

0 条评论