首页 > 试题广场 >

从单向链表中删除指定值的节点

[编程题]从单向链表中删除指定值的节点
  • 热度指数:136649 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}定义一种单向链表的构造方法如下所示:
\hspace{23pt}\bullet\,先输入一个整数 n ,代表链表中节点的总数;
\hspace{23pt}\bullet\,再输入一个整数 h ,代表头节点的值;
\hspace{23pt}\bullet\,此后输入 n-1 个二元组 \left(a, b\right) ,表示在值为 b 的节点后插入值为 a 的节点。
\hspace{15pt}除此之外,保证输入的链表中不存在重复的节点值。

\hspace{15pt}现在,对于给定的链表构造方法和一个额外的整数 k ,你需要先按照上述构造方法构造出链表,随后删除值为 k 的节点,输出剩余的链表。

输入描述:
\hspace{15pt}在一行上:
{\hspace{20pt}}_\texttt{1.}\,先输入一个整数 n \left(1 \leqq n \leqq 10^3\right) 代表链表中节点的总数;
{\hspace{20pt}}_\texttt{2.}\,随后输入一个整数 h \left(1 \leqq h \leqq 10^4\right) 代表头节点的值;
{\hspace{20pt}}_\texttt{3.}\,随后输入 n-1 个二元组 \left(a, b\right) \left(1 \leqq a, b \leqq 10^4\right)
{\hspace{20pt}}_\texttt{4.}\,最后输入一个整数 k ,代表需要删除的节点值。

\hspace{15pt}除此之外,保证每一个 b 值在输入前已经存在于链表中;每一个 a 值在输入前均不存在于链表中。节点的值各不相同。


输出描述:
\hspace{15pt}在一行上输出 n-1 个整数,代表删除指定元素后剩余的链表。
示例1

输入

5 2 3 2 4 3 5 2 1 4 3

输出

2 5 4 1

说明

\hspace{15pt}在这个样例中,链表的构造过程如下:
\hspace{23pt}\bullet\,头节点为 2 ,得到链表 \left[{\color{orange}{\bf 2}}\right]
\hspace{23pt}\bullet\,2 后插入 3 ,得到链表 \left[2, {\color{orange}{\bf 3}}\right]
\hspace{23pt}\bullet\,3 后插入 4 ,得到链表 \left[2, 3, {\color{orange}{\bf 4}}\right]
\hspace{23pt}\bullet\,2 后插入 5 ,得到链表 \left[2, {\color{orange}{\bf 5}}, 3, 4\right]
\hspace{23pt}\bullet\,4 后插入 1 ,得到链表 \left[2, 5, 3, 4, {\color{orange}{\bf 1}}\right]
\hspace{15pt}随后,删除值为 3 的节点,得到链表 \left[2, 5, 4, 1\right]
示例2

输入

6 2 1 2 3 2 5 1 4 5 7 2 2

输出

7 3 1 5 4

说明

\hspace{15pt}在这个样例中,链表的构造过程如下:
\hspace{23pt}\bullet\,头节点为 2 ,得到链表 \left[{\color{orange}{\bf 2}}\right]
\hspace{23pt}\bullet\,2 后插入 1 ,得到链表 \left[2, {\color{orange}{\bf 1}}\right]
\hspace{23pt}\bullet\,2 后插入 3 ,得到链表 \left[2, {\color{orange}{\bf 3}}, 1\right]
\hspace{23pt}\bullet\,1 后插入 5 ,得到链表 \left[2, 3, 1, {\color{orange}{\bf 5}}\right]
\hspace{23pt}\bullet\,5 后插入 4 ,得到链表 \left[2, 3, 1, 5, {\color{orange}{\bf 4}}\right]
\hspace{23pt}\bullet\,2 后插入 7 ,得到链表 \left[2, {\color{orange}{\bf 7}}, 3, 1, 5, 4\right]
\hspace{15pt}随后,删除值为 2 的节点,得到链表 \left[7, 3, 1, 5, 4\right]

备注:
\hspace{15pt}本题由牛客重构过题面,您可能想要阅读原始题面,我们一并附于此处。
\hspace{15pt}【以下为原始题面】

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表的值不能重复。

构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1

3 2表示为
2->3
链表为2->3->1

5 1表示为
1->5
链表为2->3->1->5

4 5表示为
5->4
链表为2->3->1->5->4

7 2表示为
2->7
链表为2->7->3->1->5->4

最后的链表的顺序为 2 7 3 1 5 4

最后一个参数为2,表示要删掉节点为2的值

删除 结点 2

则结果为 7 3 1 5 4

数据范围:链表长度满足  ,节点中的值满足 

测试用例保证输入合法

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let str;
rl.on('line', function (line) {
    str = line;
}).on("close",()=>{
    let list = str.split(" ");
    const [len, firstNode, ...arr] = list;
    let head = Number(firstNode);
    let deletePoint = Number(arr.pop());

    let res = [];
    res.push(head); 

    for(let i = 0; i < arr.length; i += 2){
        let value = arr[i];
        let parentNode = arr[i+1];
        let index = res.indexOf(Number(parentNode));
        if(index  > -1){
            res.splice(index + 1, 0, Number(value));
        }
    }
    
    let deleteIndex = res.indexOf(deletePoint);
    if(deleteIndex > -1){
        res.splice(deleteIndex, 1);
    }
    console.log(res.join(" "));
});

发表于 2022-11-28 23:30:03 回复(0)
let [total,head,...arr] = readline().split(' ');
let remove = arr.pop(),link = [head];
while(arr.length){
    let [tail,head,...rest] = arr;
    arr = rest;
    let index = link.indexOf(head);
    link.splice(index+1,0,tail);
}
let i = link.indexOf(remove);
link.splice(i,1);
console.log(link.join(' '))

发表于 2022-08-08 00:41:54 回复(0)
let line = readline();
const [ num, head, ...tail ] = line.split(' '); // 数组解构得到节点数量,头结点值,以及target
const target = tail.pop();

// 按照规则创建链表(数组)返回创建完成的数组
function createLinkNode(head, tail, num) {
  let list = [head];
  for (let i = 0, len = tail.length; i < len; i += 2) {
    let targetNode = tail[i];
    let frontNode = tail[i + 1]; 
    let idx = list.indexOf(frontNode);
    list.splice(idx + 1,0 , targetNode);
  }
  return list;
}

// 删除指定节点
function deleteTargetNode(list, target) {
 let index = list.indexOf(target);
  list.splice(index, 1);
  return list
}

 let linkList = createLinkNode(head, tail, num);


console.log(deleteTargetNode(linkList, target).join(' '));

发表于 2021-10-08 15:12:41 回复(1)