Java实现的循环单链表以及约瑟夫环的实现
时间: 2024-06-06 13:09:38 浏览: 89
好的,我了解您的要求。关于您的问题,Java可以实现循环单链表和约瑟夫环。循环单链表是一种特殊的单向链表,它的尾节点指向头节点,形成一个环。它的节点包含数据和指向下一个节点的指针。约瑟夫环是一个数学问题,也可以用链表来实现。算法如下:
1. 构造循环单链表并初始化节点数,设为 n。
2. 设定一个指针,指向头节点。
3. 从头节点开始遍历,每 m 个节点删除一个节点,直到链表只剩一个节点。
4. 输出最后剩下的节点。
Java代码实现如下:
//定义节点类
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
//循环单链表类
class CircularLinkedList {
private ListNode head; //头节点
private ListNode tail; //尾节点
private int size; //节点数
public CircularLinkedList() {
this.head = null;
this.tail = null;
this.size = 0;
}
//添加节点
public void addNode(int val) {
ListNode node = new ListNode(val);
if (head == null) {
head = node;
tail = node;
tail.next = head;
} else {
tail.next = node;
tail = node;
tail.next = head;
}
size++;
}
//约瑟夫环
public int josephus(int m) {
if (size == 0) return -1; //链表为空
ListNode cur = head;
while (size > 1) {
for (int i = 1; i < m - 1; ++i) {
cur = cur.next;
}
cur.next = cur.next.next; //删除第 m 个节点
size--;
cur = cur.next; //指向下一个节点
}
return cur.val;
}
}
//测试代码
public class Main {
public static void main(String[] args) {
CircularLinkedList cll = new CircularLinkedList();
for (int i = 1; i <= 10; ++i) {
cll.addNode(i);
}
System.out.println(cll.josephus(3)); //输出最后剩下的节点
}
}
以上就是Java实现循环单链表和约瑟夫环的代码。希望能够帮到您。
阅读全文