import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @描述:环形链表的约瑟夫问题
* @思路: 1. 找到最后一个节点
* 2. 从最后一个节点开始遍历链表,满足条件后剔除节点并计数清零
* @复杂度:时间O(N*M) N为链表长度、M是指定编号
* @链接:https://www.nowcoder.com/practice/c3b34059faf546d3a7ee28f2b0154286
*/
class JosephusLoop1 {
public static Node kill(Node head, int m) {
if (head == null || head == head.getNext() || m < 1) {
return head;
}
//找到最后一个节点
Node last = head;
while (last.getNext() != head) {
last = last.getNext();
}
//从最后一个节点开始遍历链表,node代表当前节点,last代表当前节点的前一个节点
int count = 0;
Node node = head;
while (node != last) {
if (++count == m) {
last.setNext(node.getNext());
count = 0;
} else {
last = last.getNext();
}
node = last.getNext();
}
return node;
}
public static void main(String[] args) {
Node head = Node.createLoopNodeList(new Integer[]{1, 2, 3, 4, 5});
head = JosephusLoop1.kill(head, 2);
System.out.println(head.getValue());
// Node.printLoopNodeList(head);
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] item = in.readLine().split(" ");
int n = Integer.parseInt(item[0]);
int m = Integer.parseInt(item[1]);
Integer[] value = new Integer[n];
for (int i = 0; i < value.length; i++) {
value[i] = i + 1;
}
Node head = Node.createLoopNodeList(value);
head = JosephusLoop1.kill(head, m);
Node.printLoopNodeList(head);
}
}
class Node {
private Node next;
private int value;
public Node(int value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public static Node createNodeList(Integer[] values) {
Node head = new Node((values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(values[i]);
node.next = newNode;
node = newNode;
}
return head;
}
public static Node createLoopNodeList(Integer[] values) {
Node head = new Node((values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(values[i]);
node.next = newNode;
node = newNode;
}
node.setNext(head);
return head;
}
public static Node createNodeList(String[] values) {
Node head = new Node(Integer.parseInt(values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(Integer.parseInt(values[i]));
node.next = newNode;
node = newNode;
}
return head;
}
public static void printNodeList(Node head) {
StringBuilder sb = new StringBuilder();
while (head != null) {
sb.append(head.getValue()).append(" ");
head = head.getNext();
}
System.out.println(sb.toString());
}
public static void printLoopNodeList(Node head) {
if(head == head.getNext()) { //只有一个节点
System.out.println(head.getValue());
} else {
StringBuilder sb = new StringBuilder();
Node last = head;
while (last.getNext() != head) {
sb.append(last.getValue()).append(" ");
last = last.getNext();
}
System.out.println(sb.toString());
}
}
}