《算法通关村第一关——链表青铜挑战笔记》

news2024/11/24 19:55:10

《算法通关村第一关——链表青铜挑战笔记》

Java如何构造出链表

概念

如何构造出链表,首先必须了解什么是链表!

单向链表就像一个铁链一样,元素之间相互链接,包含多个节点,每个节点有一个指向后继元素的next指针。表中最后一个元素的next指向null。

在这里插入图片描述

链表的核心是一个节点只能有一个后继节点,但不代表链表指向本节点的只有一个。

Java与C++不同没有了指针,只有引用,不用进行内存的回收,会使得代码的书写更加简单。

Java如何编写链表

先放代码

package AlgorithmFirst;

public class LinkedNode {
    private int data;
    private LinkedNode next;
    public LinkedNode(int data){
        this.data = data;
    }

    /**
     * 获取数据
     * @return 数据值
     */
    public int getData(){
        return this.data;
    }

    /**
     * 设置数据的值
     * @param data 数据
     */
    public void setData(int data){
        this.data = data;
    }

    /**
     * 获取下一个节点
     * @return 当前节点的下一个几点
     */
    public LinkedNode getNext(){
        return this.next;
    }

    /**
     * 设置下一个节点的值
     * @param next 下一个节点
     */
    public void setNext(LinkedNode next){
        this.next = next;
    }

    /**
     * 获取链表长度
     * @param head 头节点
     * @return
     */
    public static int getListLength(LinkedNode head){
        int length = 0 ;
        LinkedNode node = head;
        while(node != null){
            length ++ ;
            node = node.next;
        }
        return length;
    }

    /**
     * 缺省位置,直接在最后插入
     * @param head 头节点
     * @param insertNode 插入节点
     * @return 头节点
     */
    public static LinkedNode insertNode(LinkedNode head,LinkedNode insertNode){
        int size = getListLength(head);
        // return insertNode(head,insertNode,size+1); 修改一下,以便insertNode后面的元素能够全部插入进来。
        int count = 1;
        LinkedNode temp = head;
        while(temp != null){
            if(count == size ){
                temp.next = insertNode;
            }
            temp = temp.next;
            count++;
        }
        return head;
    }

    /**
     * 指定位置插入
     * @param head 头节点
     * @param nodeInsert 插入节点
     * @param position 插入位置,从1开始
     * @return 返回头节点
     */
    public static LinkedNode insertNode(LinkedNode head , LinkedNode nodeInsert, int position){
        if (head == null ){
            // 如果head == null 表示当前链表为空,可以直接返回当前节点,或者报异常,这里直接把它当作头节点。
            return nodeInsert;
        }
        // 已经存在的元素的个数
        int size = getListLength(head);
        if(position > size + 1 || position < 1 ){
            System.out.println("位置参数越界");
            return head;
        }

        // 表头插入
        if(position == 1 ){
            nodeInsert.next = head;
            // 这里可以直接 return nodeInsert
            head = nodeInsert;
            return head;
        }

        LinkedNode pNode = head;
        int count = 1;
        // 这里position 被上面的size限制住了,不用考虑pNode = null
        while(count < position -1){
            pNode = pNode.next;
            count ++ ;
        }
        nodeInsert.next = pNode.next;
        pNode.next = nodeInsert;
        return head;
    }

    /**
     * 缺省参数的删除最后一个节点
     * @param head 链表头节点
     * @return 返回新链表头节点
     */
    public static LinkedNode deleteNode(LinkedNode head){
        int size = getListLength(head);
        return deleteNode(head,size);
    }

    /**
     * 根据位置删除节点
     * @param head 链表头节点
     * @param position 位置从1开始,最大链表大小 超出不删除,返回原头节点。
     * @return 新链表头节点
     */
    public static LinkedNode deleteNode(LinkedNode head , int position){
        if(head == null) {
            // 链表为空,无法删除
            return null ;
        }
        int size = getListLength(head);
        if(position > size || position < 1 ){
            System.out.println("输入参数有误" );
            return head;
        }
        if( position == 1){
            return head.next;
        }else{
            LinkedNode cur = head;
            int count = 1;
            while(count<position-1){
                cur = cur.next;
                count ++;
            }
            LinkedNode curNode = cur.next;
            cur.next = curNode.next;
            //上面两行可以简化成 : cur.next = cur.next.next
        }
        return head;
    }

    public static void  printLinkedList(LinkedNode head){
        int count = 0;
        while(head != null){
            System.out.println("第 "+ ++count +" 个:"+ head.data);
            head = head.next;
        }
    }

    public static void main(String[] args) {
        LinkedNode head = new LinkedNode(0);
        for(int i = 0 ; i<10 ; i++){
            head = LinkedNode.insertNode(head,new LinkedNode(i+1));
        }
        System.out.println("origin:");
        printLinkedList(head);
        head = deleteNode(head,3);
        System.out.println("delete the third ");
        printLinkedList(head);
        head = deleteNode(head);
        System.out.println("delete the last one");
        printLinkedList(head);
        head = insertNode(head,new LinkedNode(11));
        System.out.println("insert one from last");
        printLinkedList(head);
        head = insertNode(head,new LinkedNode(22222),1);
        System.out.println("insert to first");
        printLinkedList(head);
    }

}

添加节点需要注意的点

链表无节点

如果开始链表无节点,那么就把插入的节点作为头节点返回

插入到头节点

注意一下插入进行的操作步骤,首先把插入节点的 next 等于 head , 然后再让head 等于 插入节点,然后返回。

插入到结尾

插入到结尾需要从head 遍历到结尾,然后用最后一个节点的next指向插入节点即可。

插入到中间

插入到中间,需要注意先通过遍历,找到要插入位置的前一个,然后插入节点的next等于前一个的next,而前一个的next指向插入节点。一定要注意顺序!

删除节点需要注意的

链表为空

直接返回

删除头节点

直接返回头节点的next 节点就好了。

删除中间节点、尾节点

首先要找到中间节点的前一个节点,让前一个节点的next指向自己的next的next就可以了。

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

在这里插入图片描述

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

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

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

相关文章

无纸记录仪接线方法和接线图

一、彩色无纸记录仪输入和输出信号接线 彩色无纸记录仪主要有以下几种接线方法 1、通讯线的连接: RS-485通讯线的连接 RS485通讯线请使用屏蔽双绞线&#xff0c;通讯线长度不能超过1000米。在通讯线长度大于100米的条件下进行通讯时&#xff0c;为减少反射和回波&#xff…

轻松搞定99%以上物联网应用系统快速交付:揭秘宏电三三开源物联网平台

万物互联的时代物联网技术涉及到了终端、通讯、平台、应用等多个层级&#xff0c;覆盖工业、电力、农业、商业等多领域。物联网需求是海量的、碎片化的&#xff0c;导致多元异构的物联网平台技术堆栈复杂&#xff0c;开发周期长、实现难度大。 如何低成本、高效地接入基于各类…

什么牌子的电容笔性价比高?口碑好的电容笔推荐

如今&#xff0c;随着生活的智能化程度不断提高&#xff0c;一些人已经把传统的笔记本电脑换成了平板电脑。我发现&#xff0c;用iPad平板画图&#xff0c;或者用iPad平板记笔记&#xff0c;真的很方便。根据我对电容笔的深刻理解&#xff0c;如果你只是想要用电容来记录&#…

这些并发测试知识点,你掌握了吗?

一、Apache Benchmark ab 命令会创建很多的并发访问线程&#xff0c;模拟多个访问者同时对某一 URL 进行访问&#xff0c;可用来测试 Apache 的负载压力&#xff0c;也可以测试 Web 服务器的压力。 安装 liunx 安装&#xff1a;yum install httpd Windows安装&#xff1a;下…

lvgl 页面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存&#xff0c;界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举&#xff0c;用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

JMeter安装及环境配置

1. JMeter 介绍 Apache组织开发的基于Java的压力测试工具 100%纯Java开发、完全的可移植性 可以用于测试静态和动态资源 多协议—HTTP/FTP/socket/Java/数据库(JDBC) 完全多线程 高可扩展性 2. 安装jdk并配置jdk环境 因为jmeter运行依赖jdk环境&#xff0c;所以在安装j…

以太网UDP数据回环实验

一、TCP/IP协议簇 前面说到TCP/IP是一个协议簇&#xff0c;其中包含有IP协议、TCP协议、UDP协议、ARP协议、DNS协议、FTP协议等。设备之间要想完成通信&#xff0c;就必须通过这些网络通信协议。 物理层的主要作用就是传输比特流&#xff08;将1、0转化为电流强弱来进行传输&am…

SpringBoot + 自定义注解 + AOP 高级玩法打造通用开关

前言 最近在工作中迁移代码的时候发现了以前自己写的一个通用开关实现&#xff0c;发现挺不错&#xff0c;特地拿出来分享给大家。 为了有良好的演示效果&#xff0c;我特地重新建了一个项目&#xff0c;把核心代码提炼出来加上了更多注释说明&#xff0c;希望xdm喜欢。 案例 …

图解Dubbo,Dubbo 服务治理详解

目录 一、介绍1、介绍 Dubbo 服务治理的基本概念和重要性2、阐述 Dubbo 服务治理的实现方式和应用场景 二、Dubbo 服务治理的原理1、Dubbo 服务治理的架构设计2、Dubbo 服务治理的注册与发现机制3、Dubbo 服务治理的负载均衡算法 三、Dubbo 服务治理的实现方式1、基于 Docker 容…

Flowable介绍及使用示例

文章目录 Flowable简介底层实现JavaSpring FrameworkMyBatisActiviti Flowable的使用示例引入依赖创建流程定义部署流程定义启动流程实例启动流程实例处理任务监控流程实例 高级用法流程监听器事件驱动定时任务其他高级功能 使用时可能遇到的问题和注意事项结论参考文献 Flowab…

微信群发消息怎么发?群发消息,只要这4个步骤!

微信是我们日常生活中使用最广泛的社交软件之一。用户通过微信可以向好友、家人、同事等联系人发送文字、图片、视频、语音、文件等信息&#xff0c;是一款非常实用的即时通信应用程序。 除了与好友进行单独聊天&#xff0c;我们有时候可能也需要将信息进行群发。但是还有很多…

又要报销了,还在手动下载整理发票吗?

大多数公司都是每个月定期提交报销&#xff0c;一般报销用的发票都是电子发票发到邮箱&#xff0c;每次要报销时都需要登录邮箱&#xff0c;点开邮件&#xff0c;一个个下载整理&#xff0c;工作量不大&#xff0c;但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一…

事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?

分布式锁和事务是分布式系统中两个重要的概念&#xff0c;它们都用于解决分布式环境下的数据一致性问题。 一、概念 分布式锁 分布式锁是一种用于在分布式环境中控制对共享资源访问的锁。分布式锁可以防止多个进程或线程同时访问共享资源&#xff0c;从而避免数据冲突和资源…

Mini小主机All-in-one搭建教程4-安装Windows11系统

Mini小主机All-in-one搭建教程4-安装Windows11系统 硬件介绍 在狗东买的 极摩客M2 到手价是2799元 具体配置如下&#xff1a; 酷睿英特尔11代标压i7 11390H 64G1TB固态。 以下是 安装Windows11系统的教程。 安装Windows11系统 下载镜像包 首先下Windows系统的懒人镜像包&…

【特纳斯电子】基于物联网的智能油烟机-仿真设计

视频及资料链接&#xff1a;基于物联网的智能油烟机-仿真设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0332203M-FZ 设计简介&#xff1a; 本设计是基于物联网的智能油烟机系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示燃气浓度&#xff1b; 2.可通过…

多媒体应用设计师 第4章 移动多媒体技术基础

1.移动多媒体技术基础 1.1.移动互联网的定义 移动互联网是指利用互联网提供的技术、平台、应用以及商业模式&#xff0c;与移动通信技术相结合并用于实践活动的总称。 1.2.移动互联网的特征 移动互联网三个层面&#xff1a;终端、软件、应用 移动互联网特征&#xff1a;2版…

在搜狗浏览器中设置代理

要在搜狗浏览器中设置代理&#xff0c;请按照以下步骤操作&#xff1a; 打开搜狗浏览器。在浏览器顶部菜单栏中点击“设置”&#xff08;一般位于右上角&#xff09;。在设置菜单中点击“代理设置”。在代理设置页面中&#xff0c;将“使用代理”选项设置为“自动检测”或“al…

通讯网关软件026——利用CommGate X2ORACLE-U实现OPC UA数据转入ORACLE

本文介绍利用CommGate X2ORACLE-U实将OPC UA数据源中的数据转入到ORACLE数据库。CommGate X2ORACLE-U是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;将OPC UA数据源的数据写入到ORACLE数据…

ssh 报错:Permission denied, please try again.

报错问题&#xff1a;执行一条远程scp远程拷贝&#xff0c;在此之前已配置好ssh无密登录&#xff0c; sudo scp -r hadoop-3.2.0 slave2:/usr/local/src/ 确保 /etc/ssh/sshd_config文件下 PasswordAuthentication no 改为 PasswordAuthentication yes 和 PermitRootLogin no …

云爬虫系统设计:云平台资源管理优化爬虫性能

目录 1、云爬虫系统概述 2、云平台资源管理优化爬虫性能的关键措施 2.1 资源池化 2.2 负载均衡 2.3 任务调度 2.4 异常处理和恢复 2.5 数据存储与处理 2.6 数据清洗和去重 2.7 分布式爬虫 2.8 任务优先级与质量 2.9节能与环保 2.10监控与日志 总结 随着互联网的快…