华为 · 链表 · 算法编程题
华为 链表 n ≤ 1e3 时限 1 秒 / 32 MB

题目描述

定义一种单向链表的构造方法如下所示:
先输入一个整数 n ,代表链表中节点的总数;
再输入一个整数 h ,代表头节点的值;
此后输入 n-1 个二元组 (a, b) ,表示在值为 b 的节点后插入值为 a 的节点。
除此之外,保证输入的链表中不存在重复的节点值。
现在,对于给定的链表构造方法和一个额外的整数 k ,你需要先按照上述构造方法构造出链表,随后删除值为 k 的节点,输出剩余的链表。

输入输出

输入描述
在一行上:
_1. 先输入一个整数 n (1 ≤ n ≤ 10^3) 代表链表中节点的总数;
_2. 随后输入一个整数 h (1 ≤ h ≤ 10^4) 代表头节点的值;
_3. 随后输入 n-1 个二元组 (a, b) (1 ≤ a, b ≤ 10^4) ;
_4. 最后输入一个整数 k ,代表需要删除的节点值。
除此之外,保证每一个 b 值在输入前已经存在于链表中;每一个 a 值在输入前均不存在于链表中。节点的值各不相同。
输出描述
在一行上输出 n-1 个整数,代表删除指定元素后剩余的链表。

样例共 2 组

样例 1 · 在这个样例中,链表的构造过程如下: 头节点为 2 ,得到链表 [orange 2] ; 在 2 后插入 3 ,得到链表 [2, orange 3] ; 在 3 后插入 4 ,得到链表 [2, 3, orange 4] ; 在 2 后插入 5 ,得到链表 [2, orange 5, 3, 4] ; 在 4 后插入 1 ,得到链表 [2, 5, 3, 4, orange 1] ; 随后,删除值为 3 的节点,得到链表 [2, 5, 4, 1] 。
输入
5 2 3 2 4 3 5 2 1 4 3
输出
2 5 4 1
样例 2 · 在这个样例中,链表的构造过程如下: 头节点为 2 ,得到链表 [orange 2] ; 在 2 后插入 1 ,得到链表 [2, orange 1] ; 在 2 后插入 3 ,得到链表 [2, orange 3, 1] ; 在 1 后插入 5 ,得到链表 [2, 3, 1, orange 5] ; 在 5 后插入 4 ,得到链表 [2, 3, 1, 5, orange 4] ; 在 2 后插入 7 ,得到链表 [2, orange 7, 3, 1, 5, 4] ; 随后,删除值为 2 的节点,得到链表 [7, 3, 1, 5, 4] 。
输入
6 2 1 2 3 2 5 1 4 5 7 2 2
输出
7 3 1 5 4

算法解析依据充分

考点:链表

数据规模 n ≤ 1e3 | 限制 1 秒 / 32MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 1e3
  • 元素值域:h ≤ 1e4,a ≤ 1e4,b ≤ 1e4(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:链表

用指针串接节点,注意断链与重连的顺序。

思路框架(链表 通法 · 非本题专属)

  1. 常用哑结点(dummy)简化头结点处理。
  2. 双指针可用于找中点、判环、找倒数第 k 个。
  3. 合并/反转/删除操作时,先保存 next 再改指针,防止断链。

实现要点:返回结果时返回 dummy.next;注意题目给出的链表格式(如 {1,3,5})。

复杂度:时间 O(n) | 空间 O(1)

该范式的通法易错点

  • 改指针前没保存 next 导致链断。
  • 空链表 / 单节点边界没处理。

对照本题

  • 数据规模 n ≤ 1e3,允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 元素值域最大到 1e4 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 5 2 3 2 4 3 5 2 1 4 3 → 输出 2 5 4 1

在这个样例中,链表的构造过程如下:

头节点为 2 ,得到链表 [orange 2] ;

在 2 后插入 3 ,得到链表 [2, orange 3] ;

在 3 后插入 4 ,得到链表 [2, 3, orange 4] ;

在 2 后插入 5 ,得到链表 [2, orange 5, 3, 4] ;

在 4 后插入 1 ,得到链表 [2, 5, 3, 4, orange 1] ;

随后,删除值为 3 的节点,得到链表 [2, 5, 4, 1] 。

样例 2:输入 6 2 1 2 3 2 5 1 4 5 7 2 2 → 输出 7 3 1 5 4

在这个样例中,链表的构造过程如下:

头节点为 2 ,得到链表 [orange 2] ;

在 2 后插入 1 ,得到链表 [2, orange 1] ;

在 2 后插入 3 ,得到链表 [2, orange 3, 1] ;

在 1 后插入 5 ,得到链表 [2, 3, 1, orange 5] ;

在 5 后插入 4 ,得到链表 [2, 3, 1, 5, orange 4] ;

在 2 后插入 7 ,得到链表 [2, orange 7, 3, 1, 5, 4] ;

随后,删除值为 2 的节点,得到链表 [7, 3, 1, 5, 4] 。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:华为机试编程模拟题4。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解