循环链表实现的一个程序

来源:互联网 发布:编程电子书下载网站 编辑:程序博客网 时间:2024/04/29 03:41

题:n个人围坐一圆桌边,从第s(s>=1)个人开始数,数到m的人离开,接在其后的人从1开始数,数到m的人离开,如此循环,直到最后一人,请用程序表示离开人的次序。

1,链表结点Person.java
===================================================================
package com.monipc.csdn;
public class Person {
private String name;
private Person pre;
private Person next;
public void setName(String name){this.name=name;}
public void setPre(Person pre){this.pre = pre;}
public void setNext(Person next){this.next = next;}
public String getName(){return this.name;}
public Person getPre(){return this.pre;}
public Person getNext(){return this.next;}
public String toString(){return this.getName();}
}
===================================================================


2,测试类Test.java
===================================================================
package com.monipc.csdn;

public class Test {

private int n=10;//共n个人
private int m=3;//数到m
private int s=21;//从第s个人数起
private Person [] duLinkList = new Person[n];//循环双向链表

/**
 * 初始化双向循环链表
 */
public void initDuLinkList(){
/*第一步:先将只有数据域的person加入列表*/
for(int i=0;i<n;i++){
Person person = new Person();
person.setName("Person-"+i);
this.duLinkList[i]=person;
}
/*第二步:再初始化前驱和后继*/
for(int i=0;i<n;i++){
int h = i-1;
int j = i+1;
h= h==-1 ? n-1 : h;
j= j==n ? 0 : j;
Person pre = (Person)this.duLinkList[h];
Person cur = (Person)this.duLinkList[i];
Person next = (Person)this.duLinkList[j];
cur.setPre(pre);
cur.setNext(next);
}
}
/**
 * 开始数
 */
public void start(){
int j = s;
j= j>=n ? j%n : j;
Person start = (Person)this.duLinkList[j-1];
Person cur = start;
System.out.println("离开顺序:");
for(int a=0;a<n;a++){
for(int i=0;i<m;i++,j++){
Person pre = cur.getPre();
Person next = cur.getNext();
if(i==m-1) {
System.out.println(cur);
pre.setNext(next);
next.setPre(pre);
start = next;
}
cur = cur.getNext();
}
}
}
public static void main(String args []){
Test test = new Test();
test.initDuLinkList();
test.start();
}
}

原创粉丝点击