【leetcode 203】 移除链表元素——两种写法

59 阅读1分钟

 题目 

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:

输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]

示例 2:

输入: head = [], val = 1
输出: []

示例 3:

输入: head = [7,7,7,7], val = 7
输出: []

提示:

  • 列表中的节点数目在范围 [0, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

题解

/** 循环 */
function removeElements2(head: ListNode | null, val: number): ListNode | null {
  if (!head) return null;

  //   创建哨兵节点,其指向链表表头的上一个节点
  let sentinel = new ListNode();
  sentinel.next = head;

  //   创建指针,其将依次指向链表的每一个节点
  let p = sentinel;

  //   这里将以 p.next 为限制条件,而不是p
  while (p?.next) {
    // 该指针的直接后继节点与val相等,则跳过下一个节点
    if (p.next.val === val) {
      p.next = p.next.next;
    } else {
      // 向后移动指针
      p = p.next;
    }
  }

  //   返回哨兵节点的 直接后继节点。
  return sentinel.next;
}

/** 递归 */
// 注意:由于递归是用栈完成,所以跳过相等节点时,其实是从后面跳的
function removeElements(head: ListNode | null, val: number): ListNode | null {
  if (!head) return null;

  //   这步是通过递归的方式,将head变成链表中每一个节点
  head.next = removeElements(head.next, val);

  //   如果相等,则跳过该节点
  return head.val === val ? head.next : head;
}