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

92 阅读1分钟

image.png leetcode原题

解题思路

  • 由于题目中已经说了, 保证链表中节点的值互不相同, 所以意味着我们只需要删除一个元素,这一步懂了可以比人家快一大步;

  • 首先要考虑删除的节点是不是头节点,因为头节点的删除跟其他的不一样,正常我们链表中删除某个节点是拿到它的前一个节点prev,改变prev.next的指向,头节点拿不到prev,需要单独判断,也可以给链表前面直接再插入一个节点,这里我选择直接判断;

  • 如果不是头节点,那么我们每次遍历到一个节点的时候,判断它的下一个节点是不是我们要删除的值,如果是的话删完直接退出循环。

/**
 * 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;
};