移除链表元素的几种方式

简介: 移除链表元素的几种方式

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 203. 移除链表元素 ,难度为 简单


Tag : 「链表」


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


示例 1:

网络异常,图片无法展示
|


输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
复制代码


示例 2:


输入:head = [], val = 1
输出:[]
复制代码


示例 3:


输入:head = [7,7,7,7], val = 7
输出:[]
复制代码


提示:


  • 列表中的节点在范围 [0, 10^4104] 内
  • 1 <= Node.val <= 50
  • 0 <= k <= 50


递归



一个直观的做法是:写一个递归函数来将某个值为 val 的节点从链表中移除。


由于是单链表,无法通过某个节点直接找到「前一个节点」,因此为了方便,我们可以为递归函数多设置一个入参,代表「前一个节点」。


代码:


class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        dfs(dummy, dummy.next, val);
        return dummy.next;
    }
    void dfs(ListNode prev, ListNode root, int val) {
        if (root == null) return ;
        if (root.val == val) {
            prev.next = root.next;
        } else {
            prev = root;
        }
        dfs(prev, prev.next, val);
    }
}
复制代码


  • 时间复杂度:O(n)O(n)
  • 空间复杂度:忽略递归带来的额外空间开销。复杂度为 O(1)O(1)


迭代



同理,我们可以使用「迭代」方式来实现,而迭代有 whilefor 两种写法。


代码:


class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        for (ListNode tmp = dummy.next, prev = dummy; tmp != null; tmp = tmp.next) {
            if (tmp.val == val) {
                prev.next = tmp.next;
            } else {
                prev = tmp;
            }
        }
        return dummy.next;
    }
}
复制代码


class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode tmp = dummy.next, prev = dummy;
        while (tmp != null) {
            if (tmp.val == val) {
                prev.next = tmp.next;
            } else {
                prev = tmp;
            }
            tmp = tmp.next;
        }
        return dummy.next;
    }
}
复制代码


  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.203 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
37 1
|
4月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
01_移除链表元素
01_移除链表元素
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
5月前
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
48 2
【数据结构OJ题】移除链表元素
|
4月前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
28 0
|
5月前
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
34 0
|
6月前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素