循环单链表解决约瑟夫环问题

约瑟夫环问题的解决:

循环单链表解决约瑟夫环问题_第1张图片

##数据结构课的作业,使用了循环单链表来解决这个问题,不过在原题的基础上作了一点点变化,下面上代码!

首先放上解决问题的代码!

import java.util.Scanner;
public class Y {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner in = new Scanner(System.in);
		//由用户定义玩家数量
		int n = in.nextInt();

		//由用户输入首个密码
		int M = in.nextInt();

		//按次序初始化添加玩家
		int password = in.nextInt(); //用户输入首个玩家的密码
		LinkList list = new LinkList<>(new Player(1,password));
		for (int i = 1; i < n; i++) {
			//用户输入每个玩家的密码
			 password = in.nextInt();
			list.initAdd(new Player(i+1,password));
		}

		//创建计数器
		int count = 1;
		while(list.getLength()>1){
			while(count!=M){
			list.next(); //游标向后浮动一位
			count++; //计数器加一
			}
			count = 1; // 初始化计数器
			Player player = list.delete().getData(); //删除当前游标所指玩家并获取该玩家
			M = player.getPassword(); //重置密码为该玩家手中的密码
			System.out.println(player.getIndex()); //输出该玩家的编号
		}
		System.out.println(list.next().getData().getIndex());//输出最后一个玩家的编号
		
		
	}

}

然后是循环单链表的代码:


// 基于约瑟夫问题的单链表;
public class LinkList {
	private int length; //数组的长度
	private Node first; //游标

	//初始化链表并添加第一个节点(不是头节点)
	public LinkList(T data){
		length = 1;
		first = new Node(data,first);
	}

	//初始化添加节点,必须在执行其他方法之前调用次方法!
	public void initAdd(T data){
		Node p = first;
		while(p.getNext()!=null&&p.getNext()!=first){
			p = p.getNext();
		}
		p.setNext(new Node(data,first));
		length++;
	}

	//删除当前游标所指节点 并返回该节点
	public Node delete(){
		Node p = first;
		Node q = first.getNext();
		while(q!=first){
			p = p.getNext();
			q = q.getNext();
		}
		p.setNext(q.getNext());
		first = q.getNext(); //游标指向所删除节点的下一个节点
		q.setNext(null);	//删除操作
		length--;
		return q;
	}
	//游标向后移动一位
	public Node next(){
		if(first.getNext()!=null){
		first = first.getNext();
	}
		return first;
	}

	//返回链表的长度
	public int getLength(){
		return length;
	}
}

熟悉的Node节点:


public class Node{
	   private T data;
	   private Node next;
	   public Node(Node next){
		   this.next = next;
	   }
	   public Node(T data,Node next){
		   this.data = data;
		   this.next = next;
	   }
	   public T getData(){
		   return data;
	   }
	   public Node getNext(){
		   return next;
	   }
	public void setData(T data) {
		this.data = data;
	}
	public void setNext(Node next) {
		this.next = next;
	}

}

最后还有简单的Player类

import java.util.Objects;

public class Player {
	private int index;
	private int password;
	public Player(int index,int password){
		this.index = index;
		this.password = password;
	}
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public int getPassword() {
		return password;
	}
	public void setPassword(int password) {
		this.password = password;
	}
/*
 下面这一段似乎可省略.......
*/
	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		Player player = (Player) o;
		return index == player.index &&
				password == player.password;
	}

	@Override
	public int hashCode() {
		return Objects.hash(index, password);
	}
}

初来乍到,写的不好,大家作个参考就好啦~

你可能感兴趣的:(循环单链表解决约瑟夫环问题)