[前端]_一起刷leetcode 剑指 Offer 18. 删除链表的节点

453 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

剑指 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 被删除的节点

思路

  1. 由于题目中已经说了, 保证链表中节点的值互不相同, 所以意味着我们只需要删除一个元素,这一步懂了可以比人家快一大步;
  2. 首先要考虑删除的节点是不是头节点,因为头节点的删除跟其他的不一样,正常我们链表中删除某个节点是拿到它的前一个节点prev,改变prev.next的指向,头节点拿不到prev,需要单独判断,也可以给链表前面直接再插入一个节点,这里我选择直接判断;
  3. 如果不是头节点,那么我们每次遍历到一个节点的时候,判断它的下一个节点是不是我们要删除的值,如果是的话删完直接退出循环。

实现

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var deleteNode = function(head, val) {
    // 判断是不是头节点
    if (head.val === val) {
        return head.next;
    }

    let cur = head;

    // 如果不是头节点就简单了,每次判断当前节点的后继节点直接进行删除
    // 正常来说我们只需要判断cur.next即可,但是如果删除的是末尾节点,删除完后cur 就为null了,所以需要兼容一下
    while (cur && cur.next) {
        if (cur.next.val === val) {
           cur.next = cur.next.next; 
           break;
        }

        cur = cur.next;
    }

    return head;
};

结果

image.png 看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。