leetcode-删除链表的节点

刷leetcode《剑指offer》第十八题“删除链表的节点”,解题方法

题目

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

解析

  1. 用原始的方法,就是从头节点开始遍历这个单链表,直至找到,删掉。
  2. 定义多一个虚拟节点,构成双指针,进行删除。
  3. 使用递归删除,将删除操作交给下一个节点。

注意

  1. 节点删除操作,单指针的删除,就是将其下一个节点的下一个换位。
  2. 定义双指针,两个指针都需要往后移。

image.png

  1. 使用递归,需要注意递归条件,以及删除逻辑。

具体代码逻辑

第一种方法
public ListNode deleteNode(ListNode head, int val) {
    // 边界条件判断
    if (head == null) {
        return null;
    }
    // 删除头节点
    if (head.val == val) {
        return head.next;
    }
    // 找到删除节点的上一个节点
    ListNode cur = head;
    while (cur.next != null && cur.next.val != val) {
        cur = cur.next;
    }
    // 删除节点
    assert cur.next != null;
    cur.next = cur.next.next;
    return head;
}
第二种方法
public ListNode deleteNode2(ListNode head, int val) {
    // 初始化虚拟节点
    ListNode dummy = new ListNode(0);
    // 让虚拟节点指向头节点(减少原链表的判断条件)
    dummy.next = head;
    ListNode cur = head;
    ListNode pre = dummy;
    // 遍历整个单链表
    while (cur != null) {
        // 找到要删除的值,直接删除
        if (cur.val == val) {
            pre.next = cur.next;
            break;
        }
        // 没有找到,往后移动
        pre = cur;
        cur = cur.next;
    }
    //返回节点的下个节点
    return dummy.next;
}
第三种方法
public ListNode deleteNode3(ListNode head, int val) {
    // 判断越界条件
    if (head == null) {
        return null;
    }
    // 找到值就删除
    if (head.val == val) {
        return head.next;
    }
    head.next = deleteNode(head.next, val);
    return head;
}
全部评论

相关推荐

如题,八股刚开始学,准备好好沉淀八股,但是害怕没实习经历,简历筛选过不去,现在找实习却感觉都是已读不回,接下来该怎么安排呢?求教
Java抽象带篮子:具体背什么八股我都帮你整理好了,可以去看看我的八股专栏,这个比较详细,如果你觉得内容有点多记忆负担比较大的话,我还在更新最常问八股整理贴,是不是很贴心?
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务