const readline = require("readline"); const rl = readline.createInterface(process.stdin, process.stdout); class Node { previous; value; next; } class LinkList { head; length; constructor(length) { // 还是需要头结点,此时head表示其中第0个结点,length必须大于0 this.length = length; this.head = new Node(); // this.head.value = 1; let current, previous = this.head; for (let i = 1; i <= this.length; i++) { current = new Node(); current.value = i; previous.next = current; current.previous = previous; previous = current; } current.next = this.head.next; this.head.next.previous = current; // this.head.next = this.current; // 不能多重赋值,赋值语句会返回undefined this.head.previous = current; } remove(node) { node.previous.next = node.next; node.next.previous = node.previous; // delete node; // JavaScript里应该无法直接删除 this.length--; return true; } // 找到从当前结点开始第n个结点(可以为负数),当前结点是第0个 // 并且再向后返回一个结点 get_n_after_node(node, n) { let property_name = "next"; if (n < 0) { property_name = "previous"; n = -n; } if (this.length < 3) return false; for (let i = 0; i < n; i++) { // 向后走n个,例如从0开始,到3结束 node = node[property_name]; } return node; } } function main(people_num, num1) { let link_list = new LinkList(people_num); let current = link_list.head; let temp; while (true) { temp = link_list.get_n_after_node(current, num1); if (!temp) break; current = temp; link_list.remove(current); } // 此时current是最后一个被删掉的结点,它的next和previous都是存在的结点 current = current.next; link_list.head.next = current; for (let i = 0; i < link_list.length; i++) { console.log(current.value); current = current.next; } } function input(prompt) { return new Promise((resolve) => { rl.question(prompt, (answer) => { resolve(answer); }); }); } async function main_() { people_num = parseInt(await input("输入人数")); num1 = parseInt(await input("输入第一个数字")); main(people_num, num1); rl.close(); } main_() // 输入人数41 // 输入第一个数字3 // 16 // 31