约瑟夫环算法(循环链表解决)

约瑟夫环算法(循环链表解决)
问题:约瑟夫环
 有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,
 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。

约瑟夫环算法(循环链表解决).现在老师出的题还是那么....... 呵呵  . 留个念像吧

java实现:
public   class  Josephus  {

    
public static void main(String[] args) {
        
if(args.length<2){
            System.out.println(
"Input N and M.");
            
return;
        }

        
int n = Integer.parseInt(args[0]);
        
int m = Integer.parseInt(args[1]);
        
int point=0,number=1;
        List
<Integer> list = new ArrayList<Integer>();
        
for(int i=1;i<=n; i++){
            
//初始化链表
            list.add(i);
        }


        
while(list.size()>1){
            
if(number%m==0){
                list.remove(point);
                
--point;
            }

            
++point;//指针后移
            ++number;
            
if(point>list.size()-1){
                
//指针越界重新开始
                point=0;
            }

        }

        

        System.out.println(list.get(
0));
        
    }

}

 

c实现:

#include  < stdio.h >
struct node
{
  
int v;
  struct node 
*next;
}
* p, * head,h;  // head是头指针,h是头结点

main()
{
  
int n,m;
  
int i;
  puts(
"请输入人数n和报数上限m :");
  scanf(
"%d%d",&n,&m);

  h.next
=NULL; //头结点的next为空
  head=&h;     //头指针指向头结点
  p=head;      //p也指向头结点

  
/**//*下面的循环用来建立循环链表*/
  
for(i=1;i<=n;i++)
  
{
    p
->next=(struct node*)malloc(sizeof(struct node));
    p
=p->next;
    p
->v=i;
    
if(i!=n)
    
{
      p
->next=NULL;
    }

    
else
    
{
      p
->next=head->next;
    }

  }


  p
=head;
  p
=p->next; //p指向第一个结点
  m%=n;//当m>n时有用
  while(p!=p->next)
  
{
    
for(i=1;i<=m-2;i++)
    
{
      p
=p->next;
    }

    printf(
"%d  ",p->next->v);
    p
->next=p->next->next;
    p
=p->next;
  }

  printf(
"%d",p->v);
}

你可能感兴趣的:(约瑟夫环算法(循环链表解决))