当前位置: 首页 > news >正文

leetcode_203. 移除链表元素_java

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

1、题目

给你一个链表的头节点 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, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

2、题解

题解1

头结点单独处理。

/**
 * 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 {
    // 移除链表中所有值等于val的节点
    public ListNode removeElements(ListNode head, int val) {
        
        // 1. 移除头节点的值等于val的情况
        // 如果当前头节点的值等于val,继续移动头节点,直到头节点值不等于val
        while(head != null && head.val == val) {
            head = head.next;  // 将头节点更新为下一个节点
        }

        // 2. 定义指针p从新的头节点开始遍历
        ListNode p = head;
        
        // 3. 遍历链表,删除所有值等于val的节点
        // 判断当前节点的下一个节点是否需要删除
        while(p != null && p.next != null) {
            // 如果下一个节点的值等于val,跳过该节点
            if(p.next.val == val) {
                p.next = p.next.next;  // 跳过下一个节点
            } else {
                p = p.next;  // 否则继续移动指针
            }
        }

        // 4. 返回修改后的链表头
        return head;
    }
}

题解2

使用一个虚拟头结点。

/**
 * 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 {
    // 移除链表中所有值等于val的节点
    public ListNode removeElements(ListNode head, int val) {
        
        // 1. 创建一个虚拟头节点 prehead,指向链表的头部
        // 这样可以方便处理头节点被删除的情况
        ListNode prehead = new ListNode(-1, head);
        
        // 2. 定义一个指针p从prehead开始遍历链表
        // prehead的next指向head,p会遍历整个链表
        ListNode p = prehead;
        
        // 3. 遍历链表
        // 当p的下一个节点不为null时继续循环
        while(p != null && p.next != null) {
            
            // 4. 判断当前节点的下一个节点是否需要删除
            // 如果下一个节点的值等于val,则跳过该节点
            if(p.next.val == val) {
                p.next = p.next.next;  // 删除当前节点的下一个节点
            } else {
                p = p.next;  // 否则,继续移动p指针到下一个节点
            }
        }
        
        // 5. 返回修改后的链表头部
        // prehead.next就是去除指定值后的链表的头节点
        return prehead.next;
    }
}

相关文章:

  • 网络安全法规与入门指南
  • 【Android Studio】第一个Android程序 运行流程 程序调试 | 实操实战图文详细
  • net9.0 中System.Text.Json序列化和反序列化
  • spring-cloud-starter-dubbo使用说明
  • TypeScript:从类型工具到前端系统设计的跃迁
  • Python和MicroPython的解释器区别
  • 【算法学习计划】回溯 -- 综合题目(上)
  • 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread
  • LINUX的使用(1)-挂载云硬盘
  • setInterval问题以及前端如何实现精确的倒计时
  • Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
  • Perl 发送邮件
  • 24统计建模国奖作品分享+写作框架提取3
  • Cursor 在前端需求开发工作流中的应用|得物技术
  • 根据日期格式化的常见规则和标准
  • 编程助手fitten code使用说明(超详细)(vscode)
  • spring mvc的拦截器HandlerInterceptor 接口详解
  • Java面试黄金宝典42
  • 2.ElasticSearch-Java API
  • 面试算法高频04-分治与回溯
  • 唐山网络运营推广/简述seo
  • wordpress app登陆/昭通网站seo
  • 网站开发里程碑/软文代写兼职
  • 一个域名一个ip做多个网站/有什么公司要做推广的
  • 深圳flash网站建设/如何推广网店
  • 哪个网站可以查蛋白互做/腾讯云服务器