Java实现n个人围成一圈
概述
在这篇文章中,我将向你介绍如何使用Java编程语言实现一个围成一圈的问题。这个问题是指n个人站在一个圆圈中,每个人都与他们旁边的两个人握手。我们将使用循环链表的数据结构来解决这个问题。通过阅读本文,你将学会如何创建循环链表,添加节点,删除节点,并进行必要的计算。
流程图
下面是我们解决这个问题的整体流程图:
1. 创建循环链表
2. 添加n个节点
3. 删除指定位置的节点
4. 打印出最后一个留下的节点
接下来,我们将一步步实现这些步骤。
创建循环链表
首先,我们需要创建一个循环链表的数据结构。循环链表是一种特殊的链表,其中最后一个节点指向第一个节点,形成一个循环。我们可以使用一个Node
类表示链表中的节点,其中每个节点都有一个next
指针指向下一个节点。
public class Node {
int data;
Node next;
}
我们还需要创建一个CircularLinkedList
类来管理链表的操作,包括添加节点、删除节点和打印链表。
public class CircularLinkedList {
Node head;
// 添加节点
public void addNode(int data) {
Node newNode = new Node();
newNode.data = data;
if (head == null) {
head = newNode;
newNode.next = head; // 将尾节点指向头节点,形成循环
} else {
Node temp = head;
while (temp.next != head) {
temp = temp.next;
}
temp.next = newNode;
newNode.next = head;
}
}
// 删除指定位置的节点
public void deleteNode(int position) {
if (head == null) {
return;
}
if (position == 1) {
Node temp = head;
while (temp.next != head) {
temp = temp.next;
}
temp.next = head.next;
head = head.next;
} else {
Node prev = head;
Node current = head;
for (int i = 1; i < position; i++) {
prev = current;
current = current.next;
}
prev.next = current.next;
}
}
// 打印链表
public void printList() {
Node temp = head;
if (head != null) {
do {
System.out.print(temp.data + " ");
temp = temp.next;
} while (temp != head);
}
System.out.println();
}
}
实现步骤
现在我们已经定义了我们的数据结构和方法,我们可以按照以下步骤来实现“n个人围成一圈”的问题。
- 创建一个
CircularLinkedList
的实例,我们将使用这个实例来管理我们的循环链表。 - 询问用户输入n的值,表示参与游戏的人数。
- 使用一个循环来添加n个节点到循环链表中。
- 打印出初始的链表。
- 询问用户输入一个要删除的节点的位置。
- 使用给定的位置删除节点。
- 打印出新的链表。
- 重复步骤5-7,直到链表中只剩下一个节点。
- 打印出最后留下的节点。
下面是具体的实现代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
CircularLinkedList list = new CircularLinkedList();
Scanner scanner = new Scanner(System.in);
// 询问用户输入n的值
System.out.print("请输入参与游戏的人数:");
int n = scanner.nextInt();
// 使用循环添加n个节点到循环链表中
for (int i = 1; i <= n; i++) {
list.addNode(i);
}
// 打印初始链表
System.out.println("初始链表:");
list.printList();
while (list.head.next != list.head) {
// 询问用户输入要删除的节点的位置
System.out.print("请输入要删除的节点的位置:");
int position = scanner.nextInt();
// 使用给定