每日一题:移除链表元素

88 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode203移除链表元素

一、题目描述:

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

示例1

image-20220315153217055.png

示例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 <= 50
  • 0 <= val <= 50

二、思路分析:

  1. 移除元素,可以循环链表,判断当前节点的val是否等于传入的值,若相同则将上一个节点的next指向下一个节点,如此来去掉当前节点

  2. 链表修改时,我们要判断是否修改的为头节点来做不同的处理。为了可以兼容头节点情况统一链表的处理,我们可以在实际头节点前设置一个虚拟头节点(哨兵节点),如此一来实际的头节点的处理过程就和其他节点没有不同了。最后结构可以返回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
};