LeetCodeday03

news2024/9/24 21:21:08

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
输出:[]

public class Leetcode203 {
    public static void main(String[] args) {
        ListNode head = new ListNode();
        head.next = new ListNode(1, new ListNode(2, new ListNode(3)));
        ListNode listNode = removeElements(head, 3);
        while (listNode != null) {
            System.out.print(listNode.val+" -> ");
            listNode = listNode.next;
        }

    }
    public static ListNode removeElements(ListNode head, int val) {
        //虚拟头结点
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        // cur 用于遍历链表
        // cur 与 dummyHead 指向堆中同一个对象 cur中删除了 dummyHead中也就删除了
        ListNode cur = dummyHead;
        while (cur.next != null) {
            if (cur.next.val == val) {
                // 删除节点
                cur.next = cur.next.next;
            }
            // 删除节点之后 不能直接移动链表
            // 如果 删除的是最后一个元素 删除之后当前 节点就是 null  null没有next 就会报空指针异常
            else {
                cur = cur.next;
            }
        }
        return dummyHead.next;
    }


}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

707.设计链表

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

示例:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3

在这里插入图片描述

public class Leetcode707 {
    public static void main(String[] args) {
        // 构造链表
        Node node = new Node(3, new Node(7, new Node(9)));
        MyLinkedList linkedList = new MyLinkedList();
        linkedList.heard = node;

        // 初始链表
        linkedList.print(linkedList.heard);

        System.out.println("get index node");
        System.out.println(linkedList.get(0));
        System.out.println(linkedList.get(1));
        System.out.println(linkedList.get(2));


        System.out.println("addAtHead");
        linkedList.addAtHead(-1);
        linkedList.print(linkedList.heard);
        linkedList.addAtHead(-11);
        linkedList.print(linkedList.heard);
        linkedList.addAtHead(-111);
        linkedList.print(linkedList.heard);

        System.out.println("addAtTail");
        linkedList.addAtTail(15);
        linkedList.print(linkedList.heard);
        linkedList.addAtTail(155);
        linkedList.print(linkedList.heard);
        linkedList.addAtTail(155);
        linkedList.print(linkedList.heard);

        System.out.println("addAtIndex");
        linkedList.addAtIndex(5, 22);
        linkedList.print(linkedList.heard);
        linkedList.addAtIndex(5, 221);
        linkedList.print(linkedList.heard);
        linkedList.addAtIndex(5, 2211);
        linkedList.print(linkedList.heard);

        System.out.println("deleteNode");
        linkedList.deleteAtIndex(1);
        linkedList.print(linkedList.heard);
        linkedList.deleteAtIndex(10);
        linkedList.print(linkedList.heard);
    }

}

class MyLinkedList {
    Node heard;

    public MyLinkedList() {
        this.heard = new Node(0);
    }


    /**
     * 获取第 i 个节点 val
     *
     * @param index index
     * @return 第 i 个节点 val
     */
    public int get(int index) {
        //计数
        int i = 0;
        // 虚拟头结点
        Node dummyHead = new Node();
        dummyHead.next = heard;

        while (dummyHead.next != null) {
            if (i == index) {
                return dummyHead.next.val;
            }
            // 指针右移
            dummyHead = dummyHead.next;
            i++;
        }
        return -1;

    }

    /**
     * 头插法
     *
     * @param val val
     */
    public void addAtHead(int val) {
        // 虚拟头结点
        Node dummyHead = new Node();
        dummyHead.next = heard;
        // 要插入的节点
        Node newNode = new Node(val);
        //  新节点的next 存放 虚拟头结点的next
        newNode.next = dummyHead.next;
        // 新节点赋值给 头结点
        heard = newNode;
    }

    /**
     * 尾插法
     *
     * @param val val
     */
    public void addAtTail(int val) {
        // 虚拟节点
        Node dummyHead = new Node();
        dummyHead.next = heard;
        while (dummyHead.next != null) {
            dummyHead = dummyHead.next;
        }
        // 遍历到最后一个节点了
        dummyHead.next = new Node(val);
    }

    public void addAtIndex(int index, int val) {
        // 小于0 插入在头部
        if (index < 0) {
            addAtHead(val);
        }
        Node dummyHead = new Node();
        dummyHead.next = heard;
        // 计数
        int i = 0;
        while (dummyHead.next != null) {
            if (i == index) {
                Node newNode = new Node(val);
                newNode.next = dummyHead.next;
                dummyHead.next = newNode;
                return;
            }
            i++;
            dummyHead = dummyHead.next;
        }
        if (index == i) {
            addAtTail(val);
        }

    }

    /**
     * 删除 第 i 个节点
     *
     * @param index index
     */
    public void deleteAtIndex(int index) {
        Node dummyHead = new Node();
        dummyHead.next = heard;
        int i = 0;
        while (dummyHead.next != null) {
            if (i == index) {
                dummyHead.next = dummyHead.next.next;
                return;
            }
            i++;
            dummyHead = dummyHead.next;
        }


    }

    /**
     * 打印 链表
     *
     * @param list list
     */
    public void print(Node list) {
        Node dummyHead = new Node();
        dummyHead.next = list;
        while (dummyHead.next != null) {
            System.out.print(dummyHead.next.val + " -> ");
            dummyHead = dummyHead.next;
        }
        System.out.println();
    }

}

class Node {
    int val;
    Node next;

    public Node(int val, Node next) {
        this.val = val;
        this.next = next;
    }

    public Node(int val) {
        this.val = val;
    }

    public Node() {
    }
}

206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:
输入:head = [1,2]
输出:[2,1]

示例 3:
输入:head = []
输出:[]

public class Leetcode206 {
    public static void main(String[] args) {
        ListNode head = new ListNode();
        head.next = new ListNode(1, new ListNode(2, new ListNode(3)));
        ListNode listNode = reverseList(head);
        while (listNode != null) {
            System.out.print(listNode.val + " -> ");
            listNode = listNode.next;
        }

    }

    /**
     * 头插法实现
     *
     * @param head head
     * @return
     */
    public static ListNode reverseList(ListNode head) {
        ListNode newList = new ListNode();
        while (head != null) {
            ListNode newNode = new ListNode(head.val);
            newNode.next = newList.next;
            newList.next = newNode;
            head = head.next;
        }
        return newList.next;

    }

    /**
     * 双指针 写法
     * @param head
     * @return
     */
    public static ListNode reverseList1(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp;
        while (cur != null) {
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+mybatis+mysql+html实现医院预约挂号管理系统

基于springbootmybatismysqlhtml实现医院预约挂号管理系统一、系统简介二、系统主要功能界面2.1登陆2.2首页&#xff08;留言板、我的预约&#xff09;--用户2.3就诊预约--用户2.4我的预约--用户2.5我参与的评介--用户2.6我的预约日程--医生2.7对我的评介--医生2.8医生管理--管…

一文探索“预训练”的奥秘!

Datawhale干货 作者&#xff1a;王奥迪&#xff0c;单位&#xff1a;中国移动云能力中心2022年下半年开始&#xff0c;涌现出一大批“大模型”的优秀应用&#xff0c;其中比较出圈的当属AI作画与ChatGPT&#xff0c;刷爆了各类社交平台&#xff0c;其让人惊艳的效果&#xff0c…

[思维模式-19]:《复盘》-7- “积”篇 - 操作复盘- 如何做好复盘

目录 一、联想&#xff1a;复盘的五个误区与七个关键成功要素 1.1 五个误区 1.2 七个关键成功要素 二、复盘的25个“坑”及对策建议 2.1 回顾、评估阶段 2.2 分析、反思阶段 2.3 萃取、提炼阶段 2.4 转化、应用阶段 2.5 复盘引导阶段 三、有效复盘的三项核心技能 3.…

java常见问题处理

文章目录一、前言二、实战演练1、idea常用快捷键使用2、idea设置字体大小3、idea设置背景颜色-背景4、idea配置Maven5、idea中配置JDK6、idea中java.util变红报错IDEA中Sources、JavaDocs路径是红色的7、idea中使用mybatisPlus 自增主键失效&#xff0c;自增主键超大小知识点8、…

ZI-data RO-data RW-data Code BSS DATA

KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释&#xff08;转&#xff09; - 酒醉的Tiger - 博客园源&#xff1a;KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释KEIL RVMDK编译后的信息Program Size: Code86496 RO-datahttps://ww…

STM32MP157驱动开发——Linux 音频驱动

STM32MP157驱动开发——Linux 音频驱动一、简介1.CS42L51 简介2.I2S总线3.STM32MP1 SAI 总线接口二、驱动开发1.音频驱动1&#xff09;修改设备树i2c 接口&#xff1a;1.8v电源管理&#xff1a;2&#xff09;SAI 音频接口设备树3&#xff09;sound 节点2.使能和修改内核的 CS42…

linux系统中字符设备驱动开发方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;linux系统中的字符设备驱动实现的基本过程。 目录 第一&#xff1a;字符设备驱动简介 第二&#xff1a;字符设备驱动开发步骤 第三&#xff1a;编写字符设备驱动实验程序 第一&#xff1a;字符设备驱动简介 字符设备是Li…

130道基础OJ编程题之: 58 ~ 67 道

130道基础OJ编程题之: 58 ~ 67 道 文章目录130道基础OJ编程题之: 58 ~ 67 道0. 昔日OJ编程题:58. BC61 金字塔图案59. BC62 翻转金字塔图案60. BC63 菱形图案61. BC64 K形图案62. BC65 箭形图案63. BC66 反斜线形图案64. BC67 正斜线形图案65. BC68 X形图案66. BC69 空心正方形…

电商大促话术

每逢节日&#xff0c;各大电商平台为了迎合节日气氛&#xff0c;会有各种大促活动&#xff0c;客户咨询量都会较平日有所增加&#xff0c;为了接待更多的客户&#xff0c;客服要掌握一定的电商大促话术。 前言 每逢节日&#xff0c;各大电商平台为了迎合节日气氛&#xff0c;会…

Python--数据容器

文章目录一、数据容器数据容器特点对比二、序列三、列表(list)3.1、列表定义&#xff1a;3.2、列表下标索引3.3、列表常用方法&#xff1a;3.4、list遍历四、元组(tuple)4.1、元组定义4.2、元组的常用方法4.3、元组的遍历五、字符串(str)5.1、字符串定义5.2、常用方法5.3、字符…

Unity 3D 资源下载 || Unity 3D 综合案例

Unity 3D 资源下载 你也可以在 Unity 3D 中执行 Window → Asset Store 菜单命令直接访问 Unity 资源商店&#xff08;Asset Store&#xff09;。 Unity 资源商店简介 Unity 资源商店https://www.assetstore.unity3d.com/ 中提供了多种类的游戏媒体资源&#xff08;人物模型…

某微1day后台RCE审计漏洞

某应用存在后台RCE&#xff0c;根据相关信息&#xff0c;我们在对后台审计过程&#xff0c;这里发现一处调用newInstance实例化溯源找到InterfaceRegisterCustomOperationCmd #excute访问路径为 /api/integration/workflowflow/getInterfaceRegisterCustomOperationgetInterfac…

腾讯云域名备案以及ssl证书申请部署springboot

网站备案 1. 先进行网站备案 网站&#xff1a;https://console.cloud.tencent.com/beian 2. 然后在进行公安备案 流程&#xff1a;https://cloud.tencent.com/document/product/243/19142 3. 再在网站中添加备案号 #示例代码如下&#xff1a; <a href"https://b…

计算机网络——ICMP协议

ICMP 支持主机或者服务器实现差错或者异常的探寻。ICMP的功能体现即发送特定的ICMP报文 类型&#xff1a;ICMP属于哪一类的 代码&#xff1a;是为了进一步区分某种类型中不同的情况 检验和&#xff1a;检验整个ICMP报文 ICMP报文 1 终点不可达类型&#xff1a;当路由器或者…

excel超链接应用:快速生成目录的几个方法-上

在平时工作中&#xff0c;为了能快速打开需要的工作表&#xff0c;我们通常会设置一个目录。目录的设置方法有很多种&#xff0c;但大多数人使用的方法还是基本的手动插入超链接的操作。虽然这个方法也行&#xff0c;但是将大大降低你的工作效率&#xff0c;那么今天&#xff0…

【eiseg教程,快速给语义分割任务打标签】

eiseg教程1.安装EISeg2.载入模型权重3.添加类别标签4.设置格式5.标注图片6.部分按键/快捷键eiseg是百度开发的半自动标注工具&#xff0c;可以快速给语义分割任务打标签&#xff0c;提高工作效率。1.安装EISeg &#xff08;1&#xff09;新建一个python3.8的虚拟环境 &#xf…

3D Diffusion模型来了!OpenAI出品,已开源

文&#xff5c;天于刀刀2022年不愧是 AIGC 行业元年。伴随着 ChatGPT 的大火使得谷歌一周之内改口“会认真评估 ChatGPT 对搜索引擎的影响”&#xff0c;OpenAI 在 3D 图像生成领域进一步放出了大招开源项目“Point-E” [1]&#xff0c;可玩程度不下于 ChatGPT&#xff01;简单…

Spring AOP源码探究

1. 前言 Spring除了IOC和DI&#xff0c;还有另一个杀手锏功能——Spring AOP。AOP是一种面向切面的编程思想&#xff0c;它的关注点是横向的&#xff0c;不同于OOP的纵向。面向对象编程时&#xff0c;如果我们要给多个类引入同一个行为&#xff0c;唯一的方式就是使用继承&…

了解SpringBoot自动配置原理

目录 1、SpringBoot特点 1.1、依赖管理 1.1.1 父项目做依赖管理 1.1.2 开发导入starter场景启动器 1.1.3 无需关注版本号&#xff0c;自动仲裁机制 1.1.4 可以修改默认版本号 1.2、自动配置 2、容器功能 2.1、组件添加 1、Configuration 2、Bean、Component、Contro…

医院室内定位导航,便捷、低成本智慧医院室内地图应用解决方案

医院布局作为公共建筑最复杂的结构之一&#xff0c;有规模大、功能复杂等特点&#xff0c;因而&#xff0c;面向医护人员、患者就诊、医院管理等一系列基础医疗服务就成了当下医院智慧化改善的首要问题。电子地图作为大家最喜闻乐见的高效应用形式&#xff0c;可高效为病患提供…