首页 > 试题广场 >

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

[编程题]从单向链表中删除指定值的节点
  • 热度指数:133656 时间限制: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

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

测试用例保证输入合法

头像 Bumble_Bee
发表于 2021-10-18 23:32:55
根本不需要链表,一个有插入功能的数组就可以了。比如Java中直接用一个ArrayList即可。 import java.util.*; public class Main {     public stati 展开全文
头像 你敲代码的样子好像蔡徐坤
发表于 2021-09-27 21:17:03
#include<bits/stdc++.h> using namespace std; int main() { int n,head; cin>>n>>head; //输入结点数和头结点的值 forward_list<int 展开全文
头像 🐼201908171342330
发表于 2021-06-20 00:15:14
思路: 👍最后的空格 代码: while True: try: l = input().split() head = l[1] rm = l[-1] l = l[2:-1] res = [head] 展开全文
头像 BSF
发表于 2021-10-24 10:41:49
class Node(): def __init__(self, val=None, next=None): self.val = val self.next = next class LinkedList(): def __init__(s 展开全文
头像 派仔
发表于 2020-08-12 16:34:08
import java.util.*; public class Main { private ListNode head; private class ListNode { int val; ListNode next; Lis 展开全文
头像 代码界的小白
发表于 2021-12-08 19:54:32
题目主要信息 1、输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 2、链表的值不能重复。 方法一:直接法 具体方法 遍历数组,依次完成节点的插入,在遍历新的一组数据时,先找到前节点,然后将后节点插入到后面。举例说明 6 2 1 2 3 2 5 1 展开全文
头像 飘221
发表于 2021-09-29 10:57:47
// 沒看到有c的,我来发一个吧 // 由于是刷题,malloc、scanf等没判断返回值,见谅 #include <stdio.h> #include <stdlib.h> typedef struct tagNode { int val; struct 展开全文
头像 牛客592166486号
发表于 2022-03-15 16:35:15
理解题目!!理解题目!!理解题目!!理解题目!! 不要拿起键盘就瞎JB写!!!! let [total, start, ...arr] = readline().split(" ").map(Number); const rmVal = arr.pop(); let res = [start]; f 展开全文
头像 摸鱼学大师
发表于 2021-10-25 11:13:22
题目的主要信息: 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针 构造链表的过程,第一个输入n表示链表长度,第二个输入时头节点值,后续n-1对输入,每对输入第一个数表示要输入的值,第二个数表示要输入的值前一个位置的值 链表中的值都不相同 方法一 展开全文
头像 Antrn
发表于 2020-12-27 01:15:14
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; int main(){ int N, headV; 展开全文