描述
定义一种单向链表的构造方法如下所示:
∙先输入一个整数 n ,代表链表中节点的总数;
∙再输入一个整数 h ,代表头节点的值;
∙此后输入 n−1 个二元组 (a,b) ,表示在值为 b 的节点后插入值为 a 的节点。
除此之外,保证输入的链表中不存在重复的节点值。
现在,对于给定的链表构造方法和一个额外的整数 k ,你需要先按照上述构造方法构造出链表,随后删除值为 k 的节点,输出剩余的链表。
输入描述:
在一行上:
1.先输入一个整数 n(1≦n≦103) 代表链表中节点的总数;
2.随后输入一个整数 h(1≦h≦104) 代表头节点的值;
3.随后输入 n−1 个二元组 (a,b)(1≦a,b≦104) ;
4.最后输入一个整数 k ,代表需要删除的节点值。
除此之外,保证每一个 b 值在输入前已经存在于链表中;每一个 a 值在输入前均不存在于链表中。节点的值各不相同。
输出描述:
在一行上输出 n−1 个整数,代表删除指定元素后剩余的链表。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
let inputArr = [];
while ((line = await readline())) {
inputArr = line.split(" ");
}
const n = Number(inputArr[0]),
h = Number(inputArr[1]),
k = Number(inputArr[inputArr.length - 1]);
const sliceInputArr = inputArr.slice(2, 2 + (n - 1) * 2);
const lianArr = [];
for (let i = 0; i < (n - 1) * 2; i += 2) {
lianArr.push([sliceInputArr[i], sliceInputArr[i + 1]]);
}
const outputArr = [h];
for (let a of lianArr) {
// 查找元素的索引
const index = outputArr.findIndex((element) => element == a[1]);
// 如果找到了元素
if (index !== -1) {
// 在找到的元素后插入新元素
outputArr.splice(index + 1, 0, a[0]);
}
}
const index = outputArr.findIndex((e) => e == k);
if (index !== -1) {
outputArr.splice(index, 1);
}
console.log(outputArr.join(' '));
})();
splice() 方法就地移除或者替换已存在的元素和/或添加新的元素。
要创建一个删除和/或替换部分内容而不改变原数组的新数组,请使用 toSpliced()。要访问数组的一部分而不修改它,参见 slice()。
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// Inserts at index 1
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "June"]
months.splice(4, 1, 'May');
// Replaces 1 element at index 4
console.log(months);
// Expected output: Array ["Jan", "Feb", "March", "April", "May"]