java循环链表实现约瑟夫环问题

原创 2015年11月19日 19:44:57

说明:测试程序,输入一个数字构成约瑟夫环,再输入另外一个数字来以此数数。最后剩下的那个人为生存者,或者猴子大王。

学习笔记:1 约瑟夫环在删除过程中要动态改变current以及prior的值。

<pre name="code" class="java">package com.marthevin.linkedlist;

import java.util.Scanner;

public class YuesefuCircleTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		   System.out.println("Input a num to create a circle....");
           Scanner  scanner = new Scanner(System.in);
           int N = scanner.nextInt();
           System.out.println("Input a num to count...");
           int M = scanner.nextInt();
           int[] array = new int[N];
           for(int i=1;i<=N;i++)
           {
        	   array[i-1] =i;
           }
           
          YuesefuCircle circle = new YuesefuCircle();
          circle.createCircleByArr(array);
          circle.deleteNodeByDivident(M);
          circle.printCircle();
          
	}

}
class NodeC{
	NodeC next;
	int data;
	public NodeC(int data)
	{
		this.data = data;
		this.next = null;
	}
}

class YuesefuCircle{
	NodeC head,tail;
	int count = 0;  //count控制最终的循环是否继续
	int divident = 0; //表示输入几个数之后删除节点
	
	public NodeC deleteNodeByDivident(int div)
	{
		this.divident = div;
		NodeC current = head, prior = head;
		while(this.count>1)
		{
			for(int i=1;i<div;i++)
			{
				prior = current;
				current = current.next;
			}
			//删除current
			if(current==head) //current 为 head 删除head  
			{
				head = head.next;
				current = head;
			}else if(current==tail) //current为tail 删除tail 
			{
				tail = prior;
				tail.next = head;
				current = head;
			}else{
				prior.next = current.next;
				current = prior.next;
			}
			count--;
		}
		return head;
	}
	
	public int createCircleByArr(int[] arr)
	{
		int number = 0;
		int length = arr.length;
		for(int i=1;i<=length;i++)
		{
			NodeC newnode = new NodeC(arr[i-1]);
			if(i == 1)
			{
				head = newnode;
				tail = newnode;
			}else{
				tail.next = newnode;
				tail = newnode;
				newnode.next = head;
			}
			number++;
			count++;
		}
		return number;
	}
	
	public void printCircle()
	{
		if(head==null)
		{
			System.out.println("null list...");
		}
		System.out.println("count= "+count+"\r\n"+"person left= "+head.data);
	}
	
	public YuesefuCircle()
	{
		head = tail = null;
	}
	
	
	
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

java编写的循环链表来实现约瑟夫环

  • 2013年11月13日 10:01
  • 2KB
  • 下载

使用单链表求解约瑟夫环问题 (利用java中的LinkedList)

约瑟夫环(Josephus)问题:古代某法官要判决n个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第s个人开始数起,每数到第d个犯人,就拉出来处决,然后再数d个,数到的人再处决……直到剩下的...
  • u011190556
  • u011190556
  • 2013年09月07日 19:32
  • 1763

java 单链表和双向链表的实现

  • 2013年08月06日 17:43
  • 10KB
  • 下载

数据结构 用双向链表实现约瑟夫环

  • 2017年11月07日 16:09
  • 6KB
  • 下载

Java环形链表--约瑟夫问题

n个小孩围成圈,丢手帕,从第start个小孩开始丢,每到第step个小孩出局;接着从下一个小孩开始,直到最后一个小孩为止,游戏结束。/** * @author Jiaozl * CycLink ...
  • u013943420
  • u013943420
  • 2017年03月19日 21:06
  • 168

环形单链表的约瑟夫问题

输入:一个环形单链表的头结点head和报数的值m。 返回:最后生存下来的节点,且这个节点自己组成环形单向链表,其他节点都删掉。 进阶:如果链表节点数为N,想在时间复杂度O(N)时完成原问题的要求,...
  • u012073449
  • u012073449
  • 2016年07月23日 10:43
  • 413

链表初解(三)——约瑟夫环之循环链表实现

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开 始报数,数到m的那个人又出列;依此规...
  • u012904198
  • u012904198
  • 2014年03月29日 01:54
  • 2033

Java循环链表实现约瑟夫环

* 单向循环链表形成约瑟环
  • chx0501
  • chx0501
  • 2015年09月27日 17:03
  • 2037

链表问题(4)-- 环形单链表的约瑟夫问题

帮我对象做了很长时间的毕业设计,关于这个每日一算法在这段时间没有坚持下来,十分惭愧。去年到今年的几个月给她做了一个毕设的小项目,是一个关于人脸活体验证身份认证系统,我会在另一个版块给大家慢慢发一些关于...
  • hzd12368
  • hzd12368
  • 2017年03月12日 16:27
  • 164

环形单链表的约瑟夫问题

环形单链表的约瑟夫问题题目: 约瑟夫环(约瑟夫问题)是一个数学的应用问题: 已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又...
  • y396397735
  • y396397735
  • 2016年05月20日 18:28
  • 920
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java循环链表实现约瑟夫环问题
举报原因:
原因补充:

(最多只允许输入30个字)