[路飞]删除链表的节点

129 阅读1分钟

题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

分析

输入:链表节点 head
输出:删除节点后的头节点

解题思路

我们要删除一个节点的方法是找到它前一个节点,然后:

cur.next = cur.next

通过改变指针来达到删除的目的。

因此我们要做的是先找到前一个节点。对于删除 head 的情况,我们需要特殊处理,所以我们用 dummyHead 来省掉一步边界条件的判断。

代码

/**
 * 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) {
  const dummyHead = new ListNode(null, head)
  let cur = dummyHead

  while (cur && cur.next && val !== cur.next.val) {
    cur = cur.next
  }

  cur.next = (cur.next && cur.next.next) || null

  return dummyHead.next
}

复杂度

时间:O(N), 遍历每一个节点
空间:O(1),只需要一个节点作为开头