【Daily Interview】- 11 移除链表元素

120 阅读1分钟

题目

图片1
图片1

!! 题目来源:移除链表元素 - 力扣

分析

链表和数组是最为基础的数据结构,这里简单介绍一下。一个链表必须有两个最基本的属性:

  • data:用于存值
  • next:指向下一个节点

看一下图就很明白了:

图片2
图片2

接下来我们简单介绍一下链表节点的新增和删除。

新增节点

新增链表节点具体操作如下:

  • 找到需要新增节点的位置,记为 cur
  • 让新节点的 next 指向 cur.next
  • 随后让 cur.next 指向新节点

同样的,看一下图就明白了:

图片3
图片3

删除节点

删除节点的具体操作如下:

  • 找到需要删除的节点,同时保留这个节点前方的节点,记为 prev
  • 然后只需要让 prev.next = cur.nextcur.next = null

如下图所示:

图片4
图片4

回到题目,是简单的删除节点,但同时有一些特殊情况需要考虑:比如需要删除的节点是头部节点应该怎么办。

如果仅仅是单独判断头部节点,是没法完全解决这个问题的,比如:

  • 链表为:[1, 1, 1, 1, 1]
  • val 为 1

这里我们引入哨兵节点的概念:令得一个节点,它的 next 指向 head,这样我们就不需要对 head 进行特出处理了。

应用在本题中的场景如下:

var removeElements = function (head, val) {
  let sentry = {
    next: head
  };
  let curr = sentry;
  while (curr.next) {
    if (curr.next.val === val) {
      curr.next = curr.next.next;
    } else {
      curr = curr.next;
    }
  }
  return sentry.next;
};

结果如下:

图片5
图片5