【中等】算法nodeJs:从单向链表中删除指定值的节点

48 阅读2分钟

描述

定义一种单向链表的构造方法如下所示:
∙先输入一个整数 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 个整数,代表删除指定元素后剩余的链表。

image.png

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"]