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. 删除链表的节点的主要内容,如果未能解决你的问题,请参考以下文章