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, num2) { 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); temp = link_list.get_n_after_node(current, num2); 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); }); }); } function visualize(dryrun, link_list) { if (dryrun) { return; } let result = { "kind": { "graph": true }, "nodes": [ ], "edges": [ ] }; let current = link_list.head.next; for (let i = 0; i < link_list.length; i++) { result.nodes.push({ "id": String(i), "label": String(current.value) }); current = current.next; result.edges.push({ "from": String(i), "to": String(i + 1) }); } result.edges[result.edges.length - 1].to = "0"; return result; } async function main_() { visualize(true); // 不加这行可能它转化成Promise的时候不会放到闭包作用域里。 people_num = parseInt(await input("输入人数")); num1 = parseInt(await input("输入第一个数字")); num2 = parseInt(await input("输入第二个数字")); main(people_num, num1, num2); rl.close(); } main_() // 输入人数10000 // 输入第一个数字123 // 输入第二个数字-654 // 1299 // 4114 // 输入人数99999 // 输入第一个数字-848 // 输入第二个数字-351 // 80178 // 23680