코드 사본은 다음과 같습니다. 패키지 목록;
java.util.arraylist 가져 오기;
/**
* Java Joseph 문제 : n 개인 (다른 ID)은 startId에서 시작하여 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 결과 :");
Arraylist <person> queuelist = test.queuepreson (n, m, startIndex);
for (개인 : Queuelist) {
System.out.println ( "Out Person :" + person);
}
System.out.println ( "사용 시간 =" +
(System.CurrentTimeMillis () -StartTime));
}
Private ArrayList <Person> QueuePreson (int n, int m, int startIndex) {
Arraylist <person> queuelist = null;
개인리스트 목록 = 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)) {
// 다음 노드를 삭제합니다
PREAR = pnode.person;
외부인 = list.remove (prev);
queuelist.add (외곽);
//system.out.println("out person : " + outperson +", size = " + list.size);
count = 0;
}
pnode = pnode.next;
카운트 ++;
}
}
반환 Queuelist;
}
개인 개인리스트 크리데이 펠리스트 (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;
공개 개인 문자 () {
}
공개 개인 목록 (사람) {
머리 = 새로운 pnode (사람, 머리);
크기 ++;
}
공개 개인리스트 (Pnode Head) {
this.head = 머리;
head.setnext (헤드);
크기 ++;
}
public pnode gethead () {
리턴 헤드;
}
공개 void sethead (pnode head) {
this.head = 머리;
}
public int getsize () {
반환 크기;
}
public void setsize (int size) {
this.size = size;
}
공개 공극 크기 (int size) {
this.size = size;
}
공개 부울 isempty () {
이 is.size <= 0;
}
공개 void inithead (사람) {
if (size == 0) {
머리 = 새로운 pnode (사람, 머리);
} 또 다른 {
pnode no = 헤드;
머리 = 새로운 pnode (사람, 아니오);
}
크기 ++;
}
Public Void Add (int Index, Person Person) {
if (size == 0) {
머리 = 새로운 pnode (사람, 머리);
head.setnext (헤드);
//system.out.println("head : " + head);
} 또 다른 {
if (index <0) {
색인 = 0;
}
if (index> size) {
색인 = 크기;
}
pnode no = 헤드;
for (int i = 0; i <(index -1); i ++) {
아니오 = No.Next;
}
pnode newnode = new Pnode (Person, No.Next);
No.Next = NewNode;
}
크기 ++;
}
공개 사람 삭제 (int index) {
pnode pnode = 제거 (index);
if ((pnode! = null) && (pnode.next! = null)) {
pnode.next.person을 반환합니다.
}
널 리턴;
}
public pnode 제거 (int index) {
if (size == 0) {
널 리턴;
} 또 다른 {
if ((index <0) || (index> = size)) {
널 리턴;
}
}
pnode no = 헤드;
for (int i = 0; i <(index -1); i ++) {
아니오 = No.Next;
}
No.Next = No.Next.next;
크기--;
if ((no! = null) && (No.Next! = null)) {
반환 번호 번호;
}
널 리턴;
}
/**
* 사람 노드의 다음 노드를 제거하고 삭제 된 사람을 반환합니다.
* @param preperson
* @return을 제거했습니다
*/
공공 사람이 제거 (Person Preperson) {
if (preperson == null) {
널 리턴;
}
if (size == 0) {
널 리턴;
}
pnode prenode = 헤드;
int index = -1;
for (int i = 0; i <size; i ++) {
if (prenode.person.id == preperson.id) {
색인 = i;
부서지다;
} 또 다른 {
prenode = prenode.next;
}
}
사람 remperson = null;
if (size <= 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);
remperson;
}
공개 int 업데이트 (Person SRC, Person Dest) {
if (src == null) {
반품 -1;
}
int index = -1;
pnode no = 헤드;
for (int i = 0; i <size; i ++) {
if (src.id == No.Person.id) {
아니요 .person = dest;
부서지다;
} 또 다른 {
아니오 = No.Next;
}
}
리턴 인덱스;
}
공개 부울 세트 (int index, person) {
if (person == null) {
거짓을 반환합니다.
}
if (size == 0) {
거짓을 반환합니다.
} 또 다른 {
if ((index <0) || (index> = size)) {
거짓을 반환합니다.
}
}
pnode no = 헤드;
for (int i = 0; i <index; i ++) {
아니오 = No.Next;
}
아니요. 직원 = 사람;
진실을 반환하십시오.
}
공공 사람이 얻는 (int index) {
pnode no = getNode (index);
if (no! = null) {
반환 번호.
}
널 리턴;
}
public pnode getNode (int index) {
if (size == 0) {
널 리턴;
} 또 다른 {
if ((index <0) || (index> = size)) {
널 리턴;
}
}
pnode no = 헤드;
for (int i = 0; i <index; i ++) {
아니오 = No.Next;
}
반환 번호;
}
public void search () {
int sizelong = 크기;
pnode no = 헤드;
for (int i = 0; i <sizelong; i ++) {
System.out.println ( "검색 색인 =" + i + "," + no);
아니오 = No.Next;
}
}
}
공개 클래스 Pnode {
사람;
pnode next = null;
public pnode () {
}
공개 pnode (사람) {
this.person = person;
}
공개 pnode (Person Person, pnode next) {
this.person = person;
this.next = 다음;
}
@보수
공개 문자열 tostring () {
"pnode [person =" + person.id + ", next =" + next.person.id +를 반환합니다.
"]";
}
공개 사람 getperson () {
귀환 담당자;
}
공공 공간 setperson (사람) {
this.person = person;
}
public pnode getnext () {
다음으로 돌아갑니다.
}
public void setnext (pnode next) {
this.next = 다음;
}
}
공공 계급 사람 {
int id = 0;
문자열 이름 = "";
공공 사람 () {
}
공개 사람 (int id, 문자열 이름) {
감독자();
this.id = id;
this.name = 이름;
}
@보수
공개 문자열 tostring () {
"person [id =" + id + ", name =" + name + "]";
}
}
}