学算法刷LeetCode【剑指offer专题】:18. 删除链表的节点

429 阅读2分钟

题目描述

image.png

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

解题思路

题目中提示这是个单链表,单链表的特征就是节点中有一个指向下一个节点的指针,如果要删除一个节点,直接这个节点的前一个节点指向它的下一个节点即可。跳过要删除的节点,这个节点就被删除了。JavaScript 中, 我们不用关心这个节点最后是否需要释放内存。

考虑三种情况:

  • 如果头节点不存在,直接返回

  • 如果头节点就是要删除的节点,直接将它的下一个节点返回。

  • 遍历单链表,变量 cur 为头节点

    • 如果 cur 的下一个节点的 val和 给定要删除的 val 值相等,则跳过该节点,将 curnext 指针指向 cur.next.nextcur.next = cur.next.next;
    • 否则,说明没有遇到要删除的节点,则直接将下一个节点复值给 cur 节点: cur = cur.next 完成遍历即可。当节点为 null 时即遍历结束。

    注意:当找到要删除的值的时候,改变的是 cur 的指针 next, cur.next = cur.next.next, 而正常遍历的时候, cur 是下一个节点 cur = cur.next

代码

/**
 * 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) return head;
    if(head.val === val) return head.next;
    let cur = head;
    while(cur.next){
        if(cur.next.val === val){
            cur.next = cur.next.next;
        }else{
            cur = cur.next
        }
    }
    return head;
};

总结

总的思路就是遍历,找到要删除的节点之后改变它的前一个元素的指针,让其指向它的后一个节点,然后需要考虑一下特殊情况,头节点不存在或者头节点的值就是要删除掉的节点的情况。

时间复杂度:O(n) 链表有 n 个, 进行了 n 次操作

空间复杂度:O(1)