剑指 Offer 18. 删除链表的结点

140 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

示例

示例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++ 语言,你不需要 free 或 delete 被删除的节点

难度:简单

此题为简单题,兄弟们可以重拳出击!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 给定一个链表,并给定一个结点值,保证在链表中对应唯一结点,删除链表中对应的结点后返回。
  2. 数值在链表中对应唯一结点,因此可以从头到尾遍历链表,并判断结点值是否等于目标值,等于就删除结点
    • 删除结点时操作:将前驱结点指向后置结点
  3. 如果头结点等于目标值,但是不存在前驱结点,因此可以在最开始对头结点进行单独判断
  4. 如果不想对头节点单独判断,可以新增结点指向头节点,这样头结点便可以进行相同逻辑
    • 最终返回时需要返回新增结点的 next 指向结点

三、AC 代码

头结点单独处理

  • 遍历链表节点,如果与目标节点相等就删除即可,需要考虑头节点相同时特殊情况
public ListNode deleteNode(ListNode head, int val) {
    if(head.next == null || head.val == val) return head.next;
    ListNode cur = head;
    while(cur.next != null){
        if(cur.next.val == val){
            cur.next = cur.next.next;
            break;
        }
        cur = cur.next;
    }
    return head;
}

image.png

头结点统一处理

  • 删除链表中的节点,遍历比较删除,头节点前增加开始节点,不需要考虑头节点特殊情况
public ListNode deleteNode(ListNode head, int val) {
    ListNode newHead = new ListNode(0);
    newHead.next = head;
    ListNode p = newHead;
    while(p.next != null){
        if(p.next.val == val){
            p.next = p.next.next;
            break;
        }
        p = p.next;
    }
    return newHead.next;
}

image.png

四、总结

知识点

  • 对于链表操作,可以定义新结点指向头结点,这样头节点就不需要进行特殊处理

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。