用java循环列表和ArrayList实现约瑟夫环(带密码问题)

//循环列表

package 容器;

import java.util.Scanner;

public class 链表 {
	//定义结点
       static class Node{ 
    	   int x;
    	   int sum;
    	   Node next;
    	   public Node(int x,int sum){
    		   this.x=x;
    		   this.sum=sum;
    	   }
       }
     public static void main(String []agrs){
    	 Scanner sc=new Scanner(System.in);
    	 System.out.println("请输入初始值M,总人数N:");
    	 int M=sc.nextInt();
    	 int N=sc.nextInt();
    	 System.out.println("请输入各自的密码:");
    	 //初始化头节点和循环链表,尾结点
    	 Node first=new Node(1,sc.nextInt());
    	 Node end=first;
    	 for(int i=2;i<=N;i++)
    	 {	 
    		 Node firm=new Node(i,sc.nextInt());
    		 end.next=firm;
    		 end=end.next;
    		 //end=(end.next=new Node(i,sc.nextInt()));
    	 }
    	 end.next=first;//首尾相接构成循环链表
    	 System.out.println("出列顺序为:");
    	 while(end!=end.next)
    	 {
    		 for(int i=1;i<M;i++)
    			 end=end.next;
    		 System.out.print(end.next.x+" ");
    		 M=end.next.sum;
    		 end.next=end.next.next;
    	 }
    	 System.out.print(end.x);
     } 
}

//ArrayList

package 容器;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class list {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList list = new ArrayList();
		System.out.println("请输入M的初始数值:");
		int M = sc.nextInt();
		System.out.println("请输入总人数:");
		int N = sc.nextInt();
		int []sum=new int[1010];
		for(int i=0 ;i<N;i++){
			list.add(i+1);
            sum[i]=sc.nextInt();
		}	
		int i=-1;
		int count=0;
		while(list.size()!=0){
			++i;
			if(i== list.size()){
				i=0;
			}
			++count;
			//输出
			if(count==M){
				System.out.print(list.get(i)+ " ");
                M=sum[(int) list.get(i)-1];
				list.remove(i);
				count=0;
				i--;//修正
			}
		}
		
	}
}

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值