剑指 Offer 18. 删除链表的节点
难度: e a s y \color{Green}{easy} easy
题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意: 此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要 f r e e free free 或 d e l e t e delete delete 被删除的节点
算法
(链表操作)
声明一个哑结点 dummy
,前驱节点 p
,当前节点 q
,如果当前节点的 值不等于要删除的节点的值,就让 p
q
分别后移一位,如果相等,就更新 p->next = q->next
。跳过当前的点。
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是链表的长度。需要遍历链表一次
-
空间复杂度 : O ( 1 ) O(1) O(1)
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
auto dummy = new ListNode(0);
auto p = dummy, q = head;
p->next = q;
while (q) {
if (q->val == val) {
p->next = q->next;
}
p = q;
q = q->next;
}
return dummy->next;
}
};
相关文章
- java 链表长度_Java实现单向链表[通俗易懂]
- 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
- 24. 两两交换链表中的节点
- 19. 删除链表的倒数第N个节点
- 删除链表的倒数第N个结点
- 链表排序python快排_python链表实例
- LeetCode | 删除链表的倒数第 N 个结点
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
- 链表相加详解程序员
- 两个链表的第一个公共节点详解编程语言
- 链表中的入口节点详解编程语言
- 从Linux构建链表:实现高效数据存储(linux链表)
- 掌握Linux内核中链表的使用(linux内核链表使用)
- Linux C语言实现双向链表(linuxc双向链表)
- 如何使用递归和非递归方式反转单向链表
- C语言单循环链表的表示与实现实例详解