Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode203移除链表元素
一、题目描述:
给你一个链表的头节点
head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回 新的头节点 。
示例1:
示例2:
输入:head=[1,3,4,1,6], val=1
输出:[3,4,6]
示例3:
输入:head=[5,5,5,5], val=5
输出:[]
- 列表中的节点数目在范围
[0, 104]内 1 <= Node.val <= 500 <= val <= 50
二、思路分析:
-
移除元素,可以循环链表,判断当前节点的val是否等于传入的值,若相同则将上一个节点的next指向下一个节点,如此来去掉当前节点
-
链表修改时,我们要判断是否修改的为头节点来做不同的处理。为了可以兼容头节点情况统一链表的处理,我们可以在实际头节点前设置一个虚拟头节点(哨兵节点),如此一来实际的头节点的处理过程就和其他节点没有不同了。最后结构可以返回vhead.next即实际的头节点。
原本链表:a=>b=>c=>d 加上虚拟头节点:vhead=>a=>b=>c=>d
三、AC 代码:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
// 定义虚拟头节点
let vhead = { next: head }
let cur = vhead
while (cur.next) {
// 判断下一个节点的值是否满足
if (cur.next.val===val) {
// 当前节点指向下下个节点(删除下个节点)
cur.next = cur.next.next
} else {
cur = cur.next
}
}
// 返回实际头节点
return vhead.next
};