移除链表元素 力扣203

一、题目

给你一个链表的头节点 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
输出:[]

二、思路

不难发现题目所给的是单链表,那么在单链表删除元素时一定要注意:我们必须要先拿到被删除节点的前驱,再让前驱指向被删除节点的后继。

在思考的过程中,发现头节点的前驱好像找不到,该如何呢?

实际上,我们只需要让head = head->next 即可删除头节点(别忘了回收节点,java中有gc机制就不用回收了。)头节点的操作需要单独处理。

第二种方法,可以添加虚拟节点,将旧头节点和其他节点的删除操作统一。

三、代码

java 复制代码
public class removeElements {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要删除的值:");
        int valToRemove = sc.nextInt();

        System.out.println("请输入链表的元素,输入非数字结束:");
        ListNode head = new ListNode(sc.nextInt());
        ListNode current =  head;
        //创建单链表
        while (sc.hasNextInt()) {
            int value = sc.nextInt();
                current.next = new ListNode(value);
                current = current.next;
        }

        ListNode resultHead = removeElements(head, valToRemove);
        printList(resultHead);
    }
    public static ListNode removeElements(ListNode head, int val) {

        /*//第一种方法,不加虚拟节点
        //删除值相同的头结点后,可能新的头结点也值相等,用循环解决
        while(head!=null && head.val==val) {
            head = head.next;
        }
        ListNode curr = head;

        while(curr!=null && curr.next !=null) {
            if(curr.next.val == val){
                curr.next = curr.next.next;   //删除节点
            } else {
                curr = curr.next;
            }
        }
        return head;*/

        //第二种方法,添加虚拟头节点,这样将旧头节点和其他节点的删除操作统一
        ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode cur = dummy;  //这里不能等于dummy.next,否则会丢失头结点
        while(cur.next != null){
            if(cur.next.val == val) {
                cur.next = cur.next.next;
            }else{
                cur = cur.next;
            }
        }
        return dummy.next;
    }
    private static void printList(ListNode head) {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val + " ");
            current = current.next;
        }
        System.out.println();
    }
}
相关推荐
Chase_______几秒前
【Java杂项】为什么 long 可以自动转 float?宽化基本类型转换与精度丢失详解
java·开发语言·python
invicinble1 分钟前
java数组相关的信息量
java·开发语言·python
小江的记录本2 分钟前
【Java基础】Java 8-21新特性 :JDK17:密封类、模式匹配、Record类(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·python·mysql·面试·职场和发展
小江的记录本4 分钟前
【Java基础】集合框架: ArrayList vs LinkedList 核心区别、扩容机制(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
夕除4 分钟前
spring boot 10
java·python·spring
牧瀬クリスだ6 分钟前
Java线程——从创建第一个线程到休眠线程
java·开发语言
清水白石0088 分钟前
从“点一下导出”到生产级任务队列:Python 异步导出系统设计全景解析
java·数据库·python
Mahir089 分钟前
Spring 核心原理:IoC/DI 与 Bean 生命周期全景解析
java·后端·spring·面试·bean生命周期·控制反转ioc·依赖注入di
weixin_4896900210 分钟前
NAS部署实测:Solon vs Spring Boot,从内存到包体积的“降维打击”
java·spring boot·后端
重生之我是Java开发战士12 分钟前
【贪心算法】柠檬水找零,将数组和减半的最少操作次数,最大数,摆动序列, 最长递增子序列,递增的三元子序列
算法·贪心算法