이 기사의 예에서는 Java가 순환 연결 목록 구조를 사용하여 Joseph의 문제를 해결하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
이것은 첫 번째 Java 시험 문제입니다. 연결 목록을 본 적이 없는 학생들에게는 지금 돌이켜보면 정말 어렵지 않습니다.
조셉 질문:
n명의 사람이 있고 그 숫자는 1, 2, 3,..., n입니다. 이 n명의 사람들이 원을 그리며 순서대로 배열되어 있습니다. 이제 s와 d가 주어졌을 때, s번째 사람부터 순서대로 1부터 세기 시작하고, d까지 센 사람이 대기열에서 나오고, 다음 사람부터 세기 시작해서 순서대로 1부터 시작하고, d에 대한 카운트는 대기열에서 다시 나올 것입니다. 이 주기는 모든 사람이 마침내 나올 때까지 계속됩니다. Joseph의 문제를 해결하기 위해서는 노드 클래스를 정의하고 순환 연결 리스트 구조를 사용하는 것이 필요합니다.
답변의 다음 Java 버전은 다음과 같습니다.
다음과 같이 코드를 복사합니다. import java.util.Scanner;
public class LinkNode { //단방향 연결 리스트의 노드 클래스
public int data; //스토리지 노드 값
public LinkNode next; //노드 값의 저장소 참조
public LinkNode(int k){ //구성 방법, 값이 k인 노드
데이터=k;
다음= null;
}
}
클래스 요세푸스{
공개 정적 무효 printJosephus(int n,int s,int d){
int i=1; //길이가 n인 원형 리스트를 생성합니다.
링크노드 q,tail;
LinkNode 헤드 = new LinkNode(i);
head.next = 머리;
tail = head; //첫 번째 노드, 꼬리, 머리가 함께 있습니다.
동안(i<n){
나++;
q = new LinkNode(i); //새 노드 추가
q.next = head; //노드의 참조는 헤드를 가리킵니다.
tail.next = q; //마지막 요소의 참조는 q를 가리킵니다.
tail = q; //그러면 마지막 요소는 q입니다.
}
int j= 0; //s부터 카운트를 시작하고 대기열의 번호를 순서대로 출력합니다.
LinkNode p = head; //계산 시작점;
동안(j<s-1){
j++;
p = p.다음;
}
while(p.next != p){
j = 1;
while(j<d-1) //계산 시작점
{
j++;
p = p.다음;
}
System.out.print(p.next.data + " "); // 대기열에서 제거된 노드 번호를 출력합니다.
p.next = p.next.next;
p = p.next; //계속해서 다음 노드를 가리킨다.
}
System.out.print(p.data);
}
공개 정적 무효 메인(String[] args) {
스캐너 입력 = new Scanner(System.in);
int n = input.nextInt();
int a = input.nextInt();
int b = input.nextInt();
Josephus.printJosephus(n, a, b);
}
}
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.