LeetCode 剑指 Offer 18. 删除链表的节点
题目描述

思路分析
解法一:虚拟头结点 + 单指针(推荐)
核心思路:
- 用虚拟头结点统一删除头节点与中间节点的逻辑。
- 指针
cur始终指向待检查节点的前一个位置。- 当
cur.next值等于目标值时,直接跳过即可。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示链表长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public ListNode deleteNode(ListNode head, int val) {
ListNode dummy = new ListNode(0);
dummy.next = head;
// cur 指向待检查节点的前一个位置
ListNode cur = dummy;
while (cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
break;
}
cur = cur.next;
}
return dummy.next;
}
}
func deleteNode(head *ListNode, val int) *ListNode {
dummy := &ListNode{Next: head}
// cur 指向待检查节点的前一个位置
cur := dummy
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
break
}
cur = cur.Next
}
return dummy.Next
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 203. 移除链表元素 | 简单 | 链表 |
| 83. 删除排序链表中的重复元素 | 简单 | 链表 |
| 82. 删除排序链表中的重复元素 II | 中等 | 链表 |
| 19. 删除链表的倒数第 N 个节点 | 中等 | 链表 |
| 237. 删除链表中的节点 | 简单 | 链表 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
