import java.util.Scanner; publicclassMain{ publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int k = scanner.nextInt(); int ans = 0; for (int i = 2; i <= n; i++) { ans = (ans + k) % i; } System.out.println(ans + 1); } }
👉以此题为例,使用单项循环链表的方式实现,但是不能作为此题AC的代码,会超时!思路如下:
首先构建一个单向的环形链表
先创建第一个节点, 让 first 指向该节点,并形成环形⚪
后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表中即可.f
然后进行报数出圈
需要创建一个辅助指针(变量) helper , 首先让其指向环形链表的最后这个节点
当开始报数时,让first 和 helper 指针同时 的移动 k - 1 次 🐌🐌
这时就可以将first 指向的节点 出圈 first = first .next helper.next = first
import java.util.Scanner; publicclassMain{ publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int k = scanner.nextInt(); addNode(n); countNode(n, k);
} publicstatic Node first = null; publicstaticvoidaddNode(int nums){ Node current = null; // 辅助指针 //创建一个循环链表 for (int i = 1; i <= nums; i++) { Node node = new Node(i); if (i == 1) { //first指向第一个孩子 first = node; first.next = first; current = first; // } else { current.next = node; node.next = first; current = node; } } } publicstaticvoidcountNode(int nums, int k){ //创建一个辅助指针helper Node helper = first; //需要创建一个辅助指针helper,事先应该指向环形链表的最后这个节点 while (true) { if (helper.next == first) { //说明helper指向最后一个节点 break; } helper = helper.next; } //当报数时,让first 和 helper指针同时移动 k- 1次,然后出圈 //这是一个循环操作,直到圈中只有一个节点 while (true) { if (first == helper) {//说明圈中只有一个节点 break; } for (int i = 0; i < k - 1; i++) { first = first.next; helper = helper.next; } //这是first指向的节点,就是要出圈的节点 first = first.next; helper.next = first; } System.out.println(first.no); } }