【leetcode】日积月累,每日一题--203. 移除链表元素(DayDayUp 12)

前 言 : \textcolor{Green}{前言:} 今天开始一下链表的题目训练,前面数组的训练还得进行,可以双面一起来。

移除链表元素

    • 一、题目
    • 二、代码及思路

题目来源

等 级 : 简 单 \textcolor{OrangeRed}{等级:简单}

一、题目

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

示例 1:
【leetcode】日积月累,每日一题--203. 移除链表元素(DayDayUp 12)_第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, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

二、代码及思路

有两种方式进行链表的操作:

  • 用原来的链表进行
  • 设置一个虚拟头节点进行

根据提示我们可以知道链表的值是不可能为负数的。所以我们可以搞一个虚拟的头节点,然后值为负数。

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

这 是 大 神 的 解 法 , 我 的 解 法 虽 然 过 了 , 但 是 发 现 有 不 严 谨 的 地 方 。 这 个 参 考 一 下 这 个 \textcolor{red}{这是大神的解法,我的解法虽然过了,但是发现有不严谨的地方。这个参考一下这个}

/**
 * 添加虚节点方式
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */
public ListNode removeElements(ListNode head, int val) {
     
    if (head == null) {
     
        return head;
    }
    // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
    ListNode dummy = new ListNode(-1, head);
    ListNode pre = dummy;
    ListNode cur = head;
    while (cur != null) {
     
        if (cur.val == val) {
     
            pre.next = cur.next;
        } else {
     
            pre = cur;
        }
        cur = cur.next;
    }
    return dummy.next;
}
/**
 * 不添加虚拟节点方式
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */
public ListNode removeElements(ListNode head, int val) {
     
    while (head != null && head.val == val) {
     
        head = head.next;
    }
    // 已经为null,提前退出
    if (head == null) {
     
        return head;
    }
    // 已确定当前head.val != val
    ListNode pre = head;
    ListNode cur = head.next;
    while (cur != null) {
     
        if (cur.val == val) {
     
            pre.next = cur.next;
        } else {
     
            pre = cur;
        }
        cur = cur.next;
    }
    return head;
}

【leetcode】日积月累,每日一题--203. 移除链表元素(DayDayUp 12)_第2张图片

你可能感兴趣的:(算法,链表,leetcode,数据结构,数据结构与算法)