剑指 Offer 18. 删除链表的节点 | Java 刷题打卡

本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接

题目

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

描述

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

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

**注意:**此题对比原题有改动

示例 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.

实现方法

方法 1

思路

  1. 要删除一个节点,首先需要找到这个节点,然后删除该节点的引用即可;
  2. 首先定位节点:如果 head.next.val == val,说明找到了该节点;
  3. 接着删除节点head.next = head.next.next
  4. 主要操作为遍历链表,直到定位确切节点,所以时间复杂度为 O(n)O(n)

实现

public ListNode deleteNode(ListNode head, int val) {
    // 边界条件
    if(head == null){
        return head;
    }

    // 当要删除的值是第一个值时,直接返回接下来的链表值即可
    if(head.val == val){
        return head.next;
    }

    ListNode current = head;
    // 找到要删除节点的前一个节点
    while(current.next != null && current.next.val != val){
        current = current.next;
    }

    // 删除节点,,即跳过要删除的节点,next 指针指向要删除节点的下一个节点
    current.next = current.next.next;

    return head;
}
复制代码

方法 2

思路

利用递归的方法,首先找到递归结束的条件,也就是找到我们所要删除的节点,此时 head.val == val,然后调用递归即可;

实现

public ListNode deleteNode(ListNode head, int val) {
    if(head.val == val) 
        return head.next;
    head.next = deleteNode(head.next,val);
    return head;

}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享