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链表实现约瑟夫环

最近学数据结构,看到约瑟夫环这一块就卡住了...感觉好难,书上的练习题叫我直接用链表实现,可是一开始的思路都没有,看了很多其他高手的代码也不是很明白,后来想想还是先用简单的数组试着写写看。 可能是我对...

Java循环链表实现约瑟夫环

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

Java——环形单链表的约瑟夫问题

【题目】   41个人排成一个圆圈,由第1个人开始报数,报数到3的人就自杀,然后再由下一个人重新报1,报数到3的人再自杀,这样依次下去,知道剩下最后一个人时,那个人可以自由选择自己的命运【代码】im...

Java循环链表实现约瑟夫环

问题描述: 约瑟夫环运作如下: 1、一群人围在一起坐成[2]  环状(如:N) 2、从某个编号开始报数(如:K) 3、数到某个数(如:M)的时候,此人出列,下一个人重新报数 4、一直循环,直...

Java实现循环链表

本案例需要完成的任务定义如下:实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。网上许多同类问题的实现方式过于复杂、难懂,本文旨在提出一种实现循环链表的简单、易懂的方法。 对于循...

北大ACM试题分类 - 实时更新我所有的解题报告链接

转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573     最近AC题:2528   更新时间:2011....

北大ACM试题1012-约瑟夫环

简直就是悲伤中的战斗机。。。居然又是两个月没更新了。。原因是搬新家而且老婆孩子来了,具体啥原因真心是一言难尽。。。但是真的感觉有了家庭就很难提起劲来学习了。。。每天也没干啥就过去了。。。这样不行。。。...

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

  • 2013年11月06日 11:12
  • 1KB
  • 下载

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

package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getDat...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java循环链表实现约瑟夫环问题
举报原因:
原因补充:

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