java之单链表的基本概念及创建

news2024/11/17 1:42:35

1.链表的概念:

链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。
组成结构: 由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
优点:  动态大小,易于插入和删除操作。
 缺点:   但访问元素时需要从头节点逐个遍历。

2.链表的结构:

(1)单向列表或双向列表:

(2).带头或者不带头节点:

(3). 循环或者非循环:

但今天我们重点讲解无头单向非循环链表:结构简单.

链表的实现:

1.无头单向非循环列表的实现:

1.1确定实现的功能并这些功能放入接口中:

我们实现的单链表功能有:头插(addFirst),尾插(addLast),展示(display),链表大小(size),    是否包含所需的值(contain), 指定位置插入元素(index), 移除指定元素(remove),将其放入接口中即可

public interface IList {
    //头插法
    public void addFirst(int data);
    //尾插法
    public void addLast(int data);
    //遍历展示
    public void disPlay();
    //得到链表的大小?
    public int size();
    //判断链表中是否包含所需的值
    public boolean contains(int key);
    //在指定位置插入元素
    public void index(int index,int data);
    //移除指定元素
    public void remove(int key);
    //清空与key相同的链表
    public void removeAllKey(int key);
    //qingli'
    public void clear();

}

1.2基本结构的实现:

(1).定义链表结构:数据域和指向下一节点的指针,创建接受收数据域的构造方法,同时也要包含头指针(head),具体代码实现如下:

static class ListNode{
        public int val;
        public ListNode next;

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

(2)创建链表:

创建5个节点并随机赋值,通过指针将5个节点连接起来。具体代码如下:

 public void creatList(){
        ListNode node1 = new ListNode(12);
        ListNode node2 = new ListNode(25);
        ListNode node3 = new ListNode(26);
        ListNode node4 = new ListNode(30);
        ListNode node5 = new ListNode(33);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        //this.node = node;
    }

1.3基本功能的实现:

(1) display()

创建一个指针cur指向头节点,    while循环cur不为空时,打印对应的值,同时指针指向下一个节点具体代码如下:

 public void disPlay(){
        ListNode cur = head;
        while(cur!=null)
        {
            System.out.println(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }

(2) size(链表大小)

创建一个cur指针,指向链表头节点head,同时创建一个整形len,while每次循环cur指针不为空,

则len自增1,同时指针指向下一个节点,循环结束返回len,具体代码如下:

public int size() {
        int len = 0;
        ListNode cur = head;
        while(cur!=null)
        {
            len++;
            cur = cur.next;
        }
        return len;
    }

(3) contain:

遍历头节点cur,若cur的值==key,则返回true,同时指向下一个节点,否则false,

具体代码如下:

  public boolean contains(int key)
        {
            ListNode cur = head;  //创建头节点
            while(cur!=null)    //循环遍历cur的值是否等于key
            {
                if(cur.val == key)
                {
                    return true;
                }
                cur = cur.next;   //地址自增
            }
            return false;
        }

(4)addFirst(头插)

新创一个节点,将新创节点的指针域传给头节点,同时将node转变为头节点:

具体代码如下:

 public void  addFirst(int data)
        {
            ListNode node  = new ListNode(data);
            node.next = head;
            head = node;  //新创节点变为头节点
        }

(4)尾插:

创建一个node节点,将data放入:

判断head头节点是否为空,为空,则为空链表,这时插入的节点既是头节点也是尾节点,将node转为头节点。

head不为空,通过while循环cur.next !=null(判断是否到达尾节点),没到达,cur节点继续往下走,到达了,把cur.next节点指向node,具体代码如下:

 public void addLast(int data)
        {
            ListNode Node =  new ListNode(data);
            if(head == null)
            {
               head = Node;
               return;
            }
            ListNode cur = head;
            while(cur.next != null)
            {
                cur = cur.next;
            }
          cur.next = Node;
        }

(5) 指定位置插入元素:

通过size方法获取链表长度并赋值给变量len,若索引index<0或index>len,此时位置不合法,需返回。

当index == 0,头插即可

当index == len,尾插即可

其余情况,举了个例子,如下,你想在2位置插入新值,就要获取1位置的节点,即index-1位置上的节点,创建一个cur节点来接收头节点,此时可以通过index-1!=0作为while循环条件,每次将cur自增1,将index自减1,让cur达到index-1的位置

这里将新节点的 next 指向当前节点 cur 的下一个节点,然后将 curnext 更新为新节点,从而实现插入

以上就是今天要分享的知识点,喜欢的老铁来个三联把!

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

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

相关文章

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术&#xff0c;tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域&#xff0c;如何把核苷酸或氨基酸序列tokenization成token呢&#xff1f; 我们可以使用k-mer技术&#xff1a; k-m…

GDPU Andriod移动应用 Activity

移动应用开发入门级必看&#xff0c;用活动打造属于你的页面。 重要的更新公告 &#xff01;&#xff01;&#xff01;GDPU的小伙伴&#xff0c;感谢大家的支持&#xff0c;希望到此一游的帅哥美女能有所帮助。本学期的前端框架及移动应用&#xff0c;采用专栏订阅量达到50才开…

医院伤员小程序点餐———未来之窗行业应用跨平台架构

一、读取服务器医院信息 var 未来之窗人工智-商家信息-医院职工 {//2024-09-22 cyber_getMerchant_CardUser_V20240922: function(appikkey,merchant_id,store_id,ecogen_sponsor_appid,openid,frommsg,wlzc_callback) {//2023-7-6 里程碑var wlzcapi"加入url";wx.re…

深度学习自编码器 - 去噪自编码器篇

序言 在深度学习的广阔天地中&#xff0c;自编码器作为一种强大的无监督学习工具&#xff0c;通过重构输入数据的方式&#xff0c;不仅实现了数据的有效压缩&#xff0c;还探索了数据的内在表示。而去噪自编码器&#xff08; Denoising Autoencoder, DAE \text{Denoising Auto…

ES6 -- 2015

学习视频 1. let和const 1.1 let 变量必须先声明再使用同一变量不能重复声明变量有块级作用域 1.2 const 声明常量&#xff0c;常量不能改变常量必须有初始值&#xff0c;不能先声明再赋值 2. 解构 1 数组解构 保持左右的结构一样&#xff0c;安装顺序一一对应 完全解构…

CVE-2024-46101

前言 自己挖的第一个CVE~ 喜提critical 这里简单说一下。 漏洞简介 GDidees CMS < 3.9.1 的版本&#xff0c;存在一个任意文件上传漏洞。允许登录后的攻击者上传webshell获得网站的权限。 影响版本&#xff1a; GDidees CMS < 3.9.1 &#xff08;其它的我没测。。&am…

日志系统扩展二:日志服务器的实现

日志系统扩展二&#xff1a;日志服务器的实现 一、设计1.为何要这么扩展&#xff1f;2.应用层协议的选择1.HTTP&#xff1f;2.自定义应用层协议 二、自定义应用层协议的实现1.声明日志器1.服务器和客户端这里日志器的关联2.枚举类型的定义3.sinks数组的定义 2.打印日志1.logMes…

MySQL record 06 part

事务、存储过程 事务&#xff1a; MySQL的同步&#xff0c;同步是指 together done&#xff0c;要么一起前进&#xff0c;要么一起后退的意思。 注意&#xff0c;回滚 rollback 对已经提交 commit 的数据是无效的&#xff0c;也就是说&#xff0c;只能对没有被提交 commit …

CSS 布局三大样式简单学习

目录 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 relative 2.3 fixed 3. css 盒子模型 3.1 效果1 3.2 效果2 3.3 效果3 3.4 效果4 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 …

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

希尔排序(C语言实现)

目录 1.希尔排序( 缩小增量排序 ) 2.动图 ​编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结&#xff1a; 1.希尔排序( 缩小增量排序 ) 基本思想&#xff1a; 1.先选定一个…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试&#xff1a;unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的&#xff0c;然后没改东西&#xff0c;点完应用Apply以后&#xff0c;就可以调试了...&#xff08;不…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等

code-with-quarkus code-with-quarkus 是使用官网生成的demo项目 这个项目使用Quarkus&#xff08;使用3.13.0版本&#xff0c;该版本支持JDK21&#xff09;&#xff0c;超音速亚原子Java框架。官网地址: https://quarkus.io/. 环境要求 OS: Windows 10.0 jdk 11 maven 3.9…

淘宝扭蛋机小程序,扭蛋机文化下的新体验

在数字化时代中&#xff0c;扭蛋机逐渐从传统的线下机器转移到了线上互联网中&#xff0c;市场得到了创新发展。扭蛋机小程序具有便捷、多样化、个性化的特点&#xff0c;迎合了当下消费者的线上消费习惯&#xff0c;又能够让扭蛋机玩家体验到新鲜有趣的扭蛋。 扭蛋机是一种热…

python简单的小项目-关于央行储蓄占比情况的数据可视化

该数据来源于锐思数据库&#xff0c;如果数据有偏差&#xff0c;可能是本人搜索的问题&#xff0c;希望大家谅解。 数据大纲&#xff1a; 其中我们制作折现统计图需要用到的是截止日期&#xff0c;表达数据最后获取的日期&#xff0c;而更新时间则是数据时效性的表示&#xff…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…