203. 移除链表元素

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 203. 移除链表元素

本题来自 LeetCode:203. 移除链表元素[1]

题目描述

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


输入: 1-2-6-3-4-5-6, val = 6
输出: 1-2-3-4-5

题目分析

采用单指针遍历链表,判断下一个节点是否为给定值,若是,则直接删掉;否则继续遍历。
需要注意的是,要特殊考虑首节点为给定值的情况。

题目解答

解法一


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 考虑首节点值为val的情况
        while(head != null && head.val == val) {
            head = head.next;
        }
        ListNode cur = head;
        while(cur != null) {
                // 若next节点等于val,直接删掉next节点
            if(cur.next != null && cur.next.val == val) {
                cur.next = cur.next.next;
            } else {
                // next节点为null,或next节点不等于val
                cur = cur.next;
            }
        }
        return head;
    }
}

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

解法二

添加辅助节点后,就不需要考虑首节点为给定值的情况。


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = dummy;
        while(cur.next != null) {
            if(cur.next.val == val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

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

参考资料

  1. 移除链表元素: https://leetcode-cn.com/problems/remove-linked-list-elements/

原文始发于微信公众号(xiaogan的技术博客):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 203. 移除链表元素


  转载请注明: 好好学java 203. 移除链表元素

 上一篇
80. 删除排序数组中的重复项 II 80. 删除排序数组中的重复项 II
本题来自 LeetCode:80. 删除排序数组中的重复项 II[1] 题目描述给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O
2021-04-05
下一篇 
283. 移动零 283. 移动零
本题来自 LeetCode:283. 移动零[1] 题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明:
2021-04-05