0ms优化剑指 Offer 18. 删除链表的节点

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0ms优化剑指 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.

说明:
题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点


解法一

class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if(head == null) return null;       // 1、没有节点
        ListNode pre = head, cur = head.next;
        if(cur == null) return null;        // 2、只有一个节点

        if(pre.val == val) return cur;      // 3、删除的是头结点
        while(cur.val != val) { // 因为特殊情况已经考虑完,因此循环结束只有一种情况,即匹配到对应值
            pre = cur;
            cur = cur.next;
        }
        pre.next = cur.next;
        return head;
    }
}

优化

只有一个节点的情况和删除首节点的情况统一

class Solution {
    public ListNode deleteNode(ListNode head, int val) {
    	if(head == null) return null;						// 空链表的情况,虽然题目中没有要求,但为了严谨还是写上
        ListNode pre = head, cur = head.next;
        if(cur == null || pre.val == val) return cur;        // 将只有一个节点的情况和删除首节点的情况统一

        while(cur.val != val) { // 因为特殊情况已经考虑完,因此循环结束只有一种情况,即匹配到对应值
            pre = cur;
            cur = cur.next;
        }
        pre.next = cur.next;
        return head;
    }
}

完整可运行代码

public class 剑指Offer18_删除链表的节点 {
    static class ListNode {
        int val;
        ListNode next;
        ListNode(int v) {val = v;}
    }
    // 1、常规解法
    static class Solution1 {
        public ListNode deleteNode(ListNode head, int val) {
            if(head == null) return null;       // 1、没有节点
            ListNode pre = head, cur = head.next;
            if(cur == null) return null;        // 2、只有一个节点

            if(pre.val == val) return cur;      // 3、删除的是头结点
            while(cur.val != val) { // 因为特殊情况已经考虑完,因此循环结束只有一种情况,即匹配到对应值
                pre = cur;
                cur = cur.next;
            }
            pre.next = cur.next;
            return head;
        }
    }
    // 2 优化:将只有一个节点的情况和删除首节点的清空统一
    static class Solution2 {
        public ListNode deleteNode(ListNode head, int val) {
    		if(head == null) return null;						// 空链表的情况,虽然题目中没有要求,但为了严谨还是写上
            ListNode pre = head, cur = head.next;
            if(cur == null || pre.val == val) return cur;        // 将只有一个节点的情况和删除首节点的情况统一

            while(cur.val != val) { // 因为特殊情况已经考虑完,因此循环结束只有一种情况,即匹配到对应值
                pre = cur;
                cur = cur.next;
            }
            pre.next = cur.next;
            return head;
        }
    }

    public static void main(String[] args) {
        ListNode head1 = new ListNode(3);
        ListNode head2 = new ListNode(4);
        ListNode head3 = new ListNode(5);
        ListNode head4 = new ListNode(6);
        head1.next = head2;
        head2.next = head3;
        head3.next = head4;

        System.out.println(head1.val + " " + head1.next.val + " " + head1.next.next.val);

        Solution1 solution1 = new Solution1();
        ListNode head5 = solution1.deleteNode(head1, 4);
        System.out.println(head5.val + " " + head5.next.val + " " + head5.next.next.val);
    }
}

以上是关于0ms优化剑指 Offer 18. 删除链表的节点的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

剑指offer--18删除链表的节点

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