コードコピーは次のとおりです。パッケージリスト。
java.util.arraylistをインポートします。
/**
* Java Josephの問題:n個の個人(異なるID)は、StartID(任意の数)からM(任意の数)をカウントし始め、Mがキューから外れ、Mがクリアされます。
*次に、次の人からM数値をカウントし、Mをカウントすることは、この方法で繰り返されます。
*削除された後、新しいキューを印刷します
*
*例
* int n = 10; //人数の総数
* int m = 3; //数値を報告します
* int startindex = 1;
* @Author Hulk 2014 03 20
*
*/
パブリッククラスJosephListTest {
public static void main(string [] args){
long starttime = system.currenttimemillis();
JosephListTest test = new JosephListTest();
int n = 10; //総数
int m = 3; //数値を報告します
int startindex = 12;
System.out.println( "JosephListtest:n =" + n + "、m =" + m +
"、startindex =" + startindex + "/n/nqueue result:");
arrayList <serson> queuelist = test.queuepreson(n、m、startindex);
for(人:Queuelist){
System.out.println( "out person:" + person);
}
system.out.println( "time =" +を使用します
(System.CurrentTimemillis() - starttime));
}
private arrayList <serson> queuepreson(int n、int m、int startindex){
arrayList <serson> queuelist = null;
PersonList list = createList(n);
//list.search();
if((list!= null)&&(list.head!= null)){
queuelist = new ArrayList <josephlisttest.person>();
pnode pnode = list.head;
if(startindex> 0){
startindex = startindex%n;
pnode = list.getNode(startIndex);
} それ以外 {
pnode = list.head;
}
int count = 1;
while(list.size> 0){
人の外人= null;
//探す
if(count ==(m -1)){
//次のノードを削除します
perver prev = pnode.person;
Outperson = list.Remove(prev);
queuelist.add(外人);
//system.out.println( "out person:" + outrens + "、size =" + list.size);
count = 0;
}
pnode = pnode.next;
count ++;
}
}
Queuelistを返します。
}
Private PersonList CreateList(int n){
PersonList list = new PersonList();
for(int i = 0; i <n; i ++){
人の人=新しい人(i、 "name_" +(i + 1));
list.add(i、person);
}
返品リスト。
}
パブリッククラスのパーソンリスト{
pnode head = null;
int size = 0;
public personlist(){
}
パブリックパーソンリスト(人){
head = new pnode(person、head);
サイズ++;
}
パブリックパーソンリスト(pnode head){
this.head = head;
head.setNext(head);
サイズ++;
}
public pnode gethead(){
頭を返します。
}
public void sethead(pnode head){
this.head = head;
}
public int getsize(){
返品サイズ。
}
public void setsize(int size){
this.size = size;
}
public void size(int size){
this.size = size;
}
public boolean isempty(){
this.size <= 0;
}
パブリックボイドinithead(人の人){
if(size == 0){
head = new pnode(person、head);
} それ以外 {
pnode no = head;
head = new pnode(person、no);
}
サイズ++;
}
public void add(int index、person person){
if(size == 0){
head = new pnode(person、head);
head.setNext(head);
//system.out.println("head: " + head);
} それ以外 {
if(index <0){
index = 0;
}
if(index> size){
index = size;
}
pnode no = head;
for(int i = 0; i <(index -1); i ++){
no = no.next;
}
pnode newNode = new PNode(person、no.next);
No.Next = newNode;
}
サイズ++;
}
パブリックパーソン削除(int index){
pnode pnode = remove(index);
if((pnode!= null)&&(pnode.next!= null)){
pnode.next.personを返します。
}
nullを返します。
}
public pnode remove(int index){
if(size == 0){
nullを返します。
} それ以外 {
if((index <0)||(index> = size)){
nullを返します。
}
}
pnode no = head;
for(int i = 0; i <(index -1); i ++){
no = no.next;
}
no.next = no.next.next;
サイズ - ;
if((no!= null)&&(no.next!= null)){
no.nextを返します。
}
nullを返します。
}
/**
*人ノードの次のノードを削除し、削除された人を返します
* @param Parperson
* @return削除された人
*/
公的人は削除します(Perperson){
if(parperson == null){
nullを返します。
}
if(size == 0){
nullを返します。
}
pnode prenode = head;
int index = -1;
for(int i = 0; i <size; i ++){
if(prenode.person.id == parterson.id){
index = i;
壊す;
} それ以外 {
prenode = prenode.next;
}
}
人のremperson = null;
if(size <= 1){
// 1つのノードのみ、その人を取得してnullとして設定します
remperson = prenode.person;
prenode = null;
} それ以外 {
//prenode.next.personはDest Oneです
remperson = prenode.next.person;
prenode.next = prenode.next.next;
}
サイズ - ;
//system.out.println("deleteing index = " + index +": " + remperson +"、size = " + size);
返却者。
}
public int update(person src、person dest){
if(src == null){
return -1;
}
int index = -1;
pnode no = head;
for(int i = 0; i <size; i ++){
if(src.id == no.person.id){
No.Person = dest;
壊す;
} それ以外 {
no = no.next;
}
}
戻りインデックス。
}
public boolean set(int index、person person){
if(person == null){
falseを返します。
}
if(size == 0){
falseを返します。
} それ以外 {
if((index <0)||(index> = size)){
falseを返します。
}
}
pnode no = head;
for(int i = 0; i <index; i ++){
no = no.next;
}
No.Person = Person;
trueを返します。
}
パブリックパーソンゲット(int index){
pnode no = getNode(index);
if(no!= null){
返品番号
}
nullを返します。
}
public pnode getNode(int index){
if(size == 0){
nullを返します。
} それ以外 {
if((index <0)||(index> = size)){
nullを返します。
}
}
pnode no = head;
for(int i = 0; i <index; i ++){
no = no.next;
}
return no;
}
public void search(){
int sizelong = size;
pnode no = head;
for(int i = 0; i <sizelong; i ++){
system.out.println( "search index =" + i + "、" + no);
no = no.next;
}
}
}
パブリッククラスのpnode {
人の人;
pnode next = null;
public pnode(){
}
public pnode(人の人){
this.person = person;
}
public pnode(人、pnode next){
this.person = person;
this.next = next;
}
@オーバーライド
public string toString(){
return "pnode [person =" + person.id + "、next =" + next.person.id +
"]";
}
公的人getPerson(){
返品者;
}
public void setPerson(人の人){
this.person = person;
}
public pnode getNext(){
次に戻ります。
}
public void setnext(pnode next){
this.next = next;
}
}
パブリッククラスの人{
int id = 0;
文字列name = "";
public person(){
}
パブリックパーソン(int id、string name){
素晴らしい();
this.id = id;
this.name = name;
}
@オーバーライド
public string toString(){
"person [id =" + id + "、name =" + name + "]";
}
}
}