首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >移除链表元素

移除链表元素

作者头像
木子星兮
发布2020-07-16 19:19:31
发布2020-07-16 19:19:31
2K0
举报
文章被收录于专栏:前端小码农前端小码农

JavaScript实现leetcode203. 移除链表元素

题目描述

删除链表中等于给定值 val 的所有节点。

示例:

代码语言:javascript
复制
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

解题方法

方法:哨兵节点

  1. 删除的节点在中间
  • 选择要删除节点的前一个节点 prev
  • 将 prev 的 next 设置为要删除节点的 next

删除的节点在中间

  1. 删除的节点在头部

删除的节点在头部

此时可以通过哨兵节点去解决它,哨兵节点广泛应用于树和链表的中,如伪头,伪尾,标记等,他们是纯功能的,通常不保存任何数据,其目的就是使得链表标准化,如使链表永不为空,永不无头,简化插入和删除。

这里的哨兵节点用于伪头。

具体的解法思路如下:

  1. 初始化哨兵节点 let linknode = new ListNode(0),且设置 linknode.next = head;
  2. 初始化两个指针 current 和 prev 指向当前节点和前一个节点
  3. 当 current 不为 null 时,比较当前节点和要删除的节点:
    • 相同则将 prev 的 next 设置为要删除节点的 next :prev.next = current.next;
    • 不相同则将 current的值更新为 prev:prev = current;
    • 继续遍历下一个元素 current = current.next;
  4. 返回 linknode.next。
代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function(head, val) {
    // 引入新的变量
    let linknode = new ListNode(0);
    linknode.next = head;
    let prev = linknode;
    let current = linknode;
    while(current) {
        // 将前一个元素的 next 指向 current.next 实现删除改节点
        // 因为可能会有很多个值等于 val,所以即使找到一个值,也要接着遍历
        if(current.val === val) {
            prev.next = current.next;
        } else {
            prev = current;
        }
        current = current.next;
    }
    return linknode.next;
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 牧码的星星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题方法
    • 方法:哨兵节点
    • 具体的解法思路如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档