写道
public class Count3Quit1 {
// 数组实现
public static int count(int num) {
boolean[] flags = new boolean[num];
int leftNum = flags.length;
int countNum = 0;
int index = 0;
while (leftNum > 1) {
if (!flags[index]) {
countNum++;
if (countNum == 3) {
flags[index] = true;
leftNum--;
countNum = 0;
}
}
index++;
if (index == flags.length) {
index = 0;
}
}
for (int i = 0; i < flags.length; i++) {
if (!flags[i]) {
return i + 1;
}
}
return -1;
}
// 双向链表实现
public static int countByLink(int num) {
Node head = new Node(null, 1, null);
Node tail = head;
for (int i = 2; i <= num; i++) {
Node next = new Node(tail, i, null);
tail.setNext(next);
tail = next;
}
tail.setNext(head);
head.setPrevious(tail);
int length = num;
int countNum = 0;
Node currentNode = head;
while (currentNode.getData() != currentNode.getNext().getData()) {
countNum++;
if (countNum == 3) {
currentNode.getPrevious().setNext(currentNode.getNext());
currentNode.getNext().setPrevious(currentNode.getPrevious());
countNum = 0;
}
currentNode = currentNode.getNext();
}
return currentNode.getData();
}
public static void main(String[] args) {
System.out.println(countByLink(500));
}
}
class Node {
private int data;
private Node next;
private Node previous;
public Node getPrevious() {
return previous;
}
public void setPrevious(Node previous) {
this.previous = previous;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Node previous, int data, Node next) {
super();
this.data = data;
this.next = next;
this.previous = previous;
}
}
分享到:
相关推荐
数据结构大作业,c++用双向链表实现约瑟夫环,内含.h与.cpp
已知N个人(以编号1,2,3...n分别表示)围成一个圈。 从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从1开始报数,依照此规律重复下去,直到圆圈中的人全部出列。 问题:请打印出这N个的...双向链表实现的
双向链表约瑟夫问题的解决方案不仅适用于理论研究,还可以帮助我们理解链表操作和循环逻辑。在实际应用中,这类问题可以映射到资源分配、任务调度等场景,通过优化算法来提高效率。 总的来说,利用双向链表解决...
约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表
下面我们将深入探讨如何使用C++实现约瑟夫环问题的双向链表解决方案: 1. **链表节点定义**:首先,我们需要定义一个链表节点结构体,包括一个整型数据(用于存储报数),一个指向下一个节点的指针,以及一个指向前...
以下是一个简单的C++双向链表约瑟夫环的实现思路: 1. 定义链表节点结构体,包含数据域(序号)、前向指针和后向指针。 2. 创建链表,将所有参与者按顺序插入链表,形成环状。 3. 设置计数器和移除条件,通常是从1...
约瑟夫环有很多种问法,这里举例了其中一种,不过都大同小异 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围, 每个人都有自己的一个密码。 从第一个人开始报数,数到m(初始设定)的那个人出列; 他的下...
不再采用单向循环链表解决约瑟夫问题,而是双向循环链表解决约瑟夫,并采用一些技巧来解释使用说明,即教程,并且密码可以为正整数,也可以为负数
《双向循环链表解决约瑟夫实验报告》 约瑟夫环问题,也称为约瑟夫问题或约瑟夫死亡循环,是一个著名的理论问题。它源于古罗马的一个传说,涉及一组囚犯围成一圈,按照一定的规则淘汰,直到只剩一人存活。在计算机...
用双向循环链表解决约瑟夫环问题的程序清单
#### 知识点四:双向链表实现约瑟夫环 第三段代码展示了使用双向链表来解决约瑟夫环问题的方法。双向链表相比单向链表增加了对前一个节点的引用,使得删除节点的操作更为简便。 1. **创建双向链表**: - 创建链表...
在这个主题中,我们将深入探讨两种基本的链表类型:单向链表和双向链表。这两种链表在许多实际应用中都有广泛的应用,例如在操作系统、编译器设计、数据库系统等。 首先,我们来看单向链表。单向链表是一种线性数据...
链表有单向链表、双向链表、循环链表三种。单向循环链表是一种特殊的链表结构,它的尾节点的后继节点指向头结点,使得链表形成一个环。 解决约瑟夫问题的算法可以分为两个部分:建立链表和删除链结点。首先,建立一...
约瑟夫双向生死游戏是一种基于环形链表或队列的经典问题,它的基本思想源于一个古老的传说:在古代,一群囚犯被围成一个圈,按照一定的规则每隔一定人数淘汰一个人,直到只剩最后一个人为止。这个过程就被称为约瑟夫...
链表实现是最直观的方法,通常使用双向链表来模拟环状结构。每个节点代表一个人,节点包含两个属性:编号(表示人的顺序)和指针(指向下一个节点)。算法步骤如下: 1. 初始化链表,将所有人按照顺序插入链表形成...
双向链表是一种链式存储结构,每个节点不仅包含数据,还包含两个指针,分别指向其前一个和后一个节点。在双向循环链表中,最后一个节点的指针会指向第一个节点,形成一个环形结构,这使得在链表中的导航更为灵活。 ...
《约瑟夫环问题与链表的实现》 约瑟夫环问题,也称为约瑟夫问题,源自古罗马的一个传说。问题的核心是:一群人在一个圆圈中按顺时针方向站立,从某个人开始报数,每报到特定数字的人将离开圆圈,然后从下一个人继续...
在C++编程中,循环链表和双向链表是两种重要的数据结构,它们在处理动态数据集合时提供了灵活且高效的方式。循环链表是单链表的一种变体,它的最后一个节点指向链表的第一个节点,形成了一个逻辑上的环。双向链表则...
在约瑟夫环中,我们可以创建一个双向链表,每个节点代表一个人,并包含指向其左右相邻人的指针。当某个人被排除时,我们只需要更新相邻节点的链接即可。例如,如果报数到3的人会被淘汰,我们可以通过遍历链表,每数3...
自己用C语言写的功能比较齐全的约瑟夫环的代码。可以设置开始位置。设置数到的数字。使用了双向链表。比较适合新手用来学习。