题目
!! 题目来源:移除链表元素 - 力扣
分析
链表和数组是最为基础的数据结构,这里简单介绍一下。一个链表必须有两个最基本的属性:
data:用于存值next:指向下一个节点
看一下图就很明白了:
接下来我们简单介绍一下链表节点的新增和删除。
新增节点
新增链表节点具体操作如下:
- 找到需要新增节点的位置,记为
cur - 让新节点的
next指向cur.next - 随后让
cur.next指向新节点
同样的,看一下图就明白了:
删除节点
删除节点的具体操作如下:
- 找到需要删除的节点,同时保留这个节点前方的节点,记为 prev
- 然后只需要让
prev.next = cur.next和cur.next = null
如下图所示:
回到题目,是简单的删除节点,但同时有一些特殊情况需要考虑:比如需要删除的节点是头部节点应该怎么办。
如果仅仅是单独判断头部节点,是没法完全解决这个问题的,比如:
- 链表为:
[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;
};
结果如下: