您的位置:首页 > 编程语言 > Java开发

Java循环链表实现约瑟夫环

2009-02-28 16:56 609 查看
鉴于毕设是关于算法的,我又是用Java实现的,所以开始学习Java实现的一些算法。
第一个就是约瑟夫环,因为以前学数据结构的时候用C写过。不知道自己当时太笨还是怎么着,写出来的代码一长串,怎么看怎么麻烦,Java的简单多了。

1.Java循环链表版的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

public class Josephus {
static class Node{
int val;
Node next;
Node(int v){
val=v;
}
}//成员类,代表节点,类似于数据结构中的结构体
public static void main(String[] args) {
int N=9;//这个表示总人数
int M=5;//数到几的人出列
Node t=new Node(1);//头节点单列出来,方便形成循环链表
Node x=t;

for(int i=2;i<=N;i++)x=(x.next=new Node(i));//建立单向链表
x.next=t;//最后一个节点的next指向第一个节点,形成循环链表
System.out.println("出圈的顺序为:");
while(x!=x.next){
for(int i=1;i<M;i++)
x=x.next;
//此时x是将出列的节点的前一个节点
System.out.print(x.next.val+" ");
x.next=x.next.next;
}
System.out.println();
System.out.println("Survivors is "+x.val);
}//end main
}

2.这个是当初用C写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2829
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

#include ><stdio.h>
#define size 7
typedef struct  node{
int data;
int pass;
struct node  * next;
}node,*LinkNode;
void main()
{
LinkNode head,p,s,q,r;
int x,y,n,m,i;
head=(node *)malloc(sizeof(node));
p=head;
for(n=1;n<=size;n++) {
printf("\n  the %d number is :",n);
scanf("%d",&x);
printf("\n  the %d pass is :",n);
scanf("%d",&y);
s=(node *)malloc(sizeof(node));
s->data=x;
s->pass=y;
p->next=s;
p=s;
}
head=head->next;
p->next=head;

m=20;
q=p->next;
while(q->next->next!=q)
{
if(m==2){
r=q->next;
m=r->pass;
printf(" %d",r->data);
q->next=r->next;
q=q->next;
}
if(m==1){
r->next=q;
r->next=q->next;
m=q->pass;
printf("  %d",q->data);
q=r->next;
}

else{
for(i=1;i<=m-2;i++){
q=q->next;
}

r=q->next;
q->next=r->next;
m=r->pass;
printf(" %d",r->data);
q=q->next;
}

}
r=q->next;
if(m%2==0){
printf(" %d %d",r->data,q->data);
}
else  {

printf(" %d %d",q->data,r->data);
}

}

3.今天还在网上看了一个更简单的,先保存起来,还需要进一步的研究。网址是http://www.9php.com/FAQ/cxsjl/c/2007/03/403506277877.html

1
2
3
4
5
6
7

int fun(int n, int m)
{
int i, r = 0;
for (i = 2; i <= n; i++)
r = (r + m) % i;
return r+1;
}

4.还有一种是用数组实现的Java版的约瑟夫环,暂时还没太懂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: