线性表的链式存储结构————单链表(java)

news2024/11/24 14:31:17

线性表的链式存储结构————单链表(java)

文章目录

  • 线性表的链式存储结构————单链表(java)
    • 链表的概述
    • 单链表
    • 单链表的创建
    • 插入结点的操作
      • 尾插法
      • 头插法
    • 求单链表的长度
    • 输出单链表
    • 查找单链表数据元素对应的索引值
    • 删除数据元素
    • 总代码
    • 结语

嗨!收到一张超级美丽的风景图,愿你每天都能顺心!
在这里插入图片描述

链表的概述

线性表的链式存储结构称之为链表。线性表的每个元素用一个内存结点存储,每个内存结点不仅包含元素本身的信息(称为数据域),而且包含表示元素之间逻辑关系的信息。

单链表

单链表中每个元素实际上是一个单独的对象,而所有对象通过每个元素中的引用字段链接在一起。

在这里插入图片描述

单链表的创建

在单链表中,我们把每个结点类型用LinkNode表示,它应包括存储元素的数据域,这里我们用data表。以及下一个结点我们用next表示。

class LinkNode{
    int data;
    LinkNode next;
    LinkNode(int e){
        data = e;
        next = null;
    }
}

由于一开使单链表只有元素e,所以我们的首结点就是尾结点,那么next指向下一个的结点就是空值。

  • 单链表中首结点的插入和删除操作与其他结点一致,无需进行特殊处理。
  • 无论单链表是否为空都有一个头节点,因此统一了空表和非空表的处理过程。
  • 在单链表中,由于每个结点只包含一个指向指向后继结点,所以当访问过一个结点后只能接着访问它的后继结点,而无法访问它的前驱结点,因此在进行单链表的插入和删除时就不能简单地只对该结点进行操作,必须考虑其后面结点。

插入结点的操作

尾插法

第一种我们采用的是尾插法,该方法从一个空表开始依次读取链表,生成一个新的结点,将读取的元素存放到该结点的数据域中,然后将其插入当前链表的尾巴上,直到链表所有元素读完为止。
在这里插入图片描述

e9dd7bf4.png#pic_center)

  • 首先我们要判断链表是否为空,即首结点是否为空,如果为空,创建一个,并将这个结点设置为首结点。
  • 如果链表不为空,就开始遍历循环,直到找到最后一个结点为空结点,此时创建一个对象传入我们要插入的值,并将其设置为当前节点的下一个节点,从而将新节点添加到链表的尾部。
    private LinkNode head;
    public LinkedList(){
        head = null;
    }
    public void add(int e){
        if(head == null){
            head = new LinkNode(e);
        }else {
            LinkNode current = head;
            while (current.next != null){
                current = current.next;
            }
            current.next = new LinkNode(e);
        }
    }

头插法

该方法是从一个空表开始依次读取链表中的元素,生成一个新的结点,将读取的元素存放到数据域中,然后将其插到当前链表的表头。
在这里插入图片描述

  • 首先我们要判断链表是否为空,即首结点是否为空,如果为空,创建一个,并将这个结点设置为首结点。
  • 如果链表不为空就将插入的元素变为链表的首结点
    private LinkNode head;
    public LinkedList(){
        head = null;
    }
    public void add(int e){
        if(head == null){
            head = new LinkNode(e);
        }else {
            LinkNode current = new LinkNode(e);
            current.next = head;
            head = current;
        }
    }

求单链表的长度

该运算返回单链表中数据结点的个数。由于单链表没有存放数据结点的个数信息,需要通过遍历来实现统计。

    public static int ListLength(LinkNode head){
        int length = 0;
        LinkNode current = head;
        while (current != null){
            length++;
            current = current.next;
        }
        return length;
    }
    public void List_Length(){
        int length = ListLength(head);
        System.out.println(length);
    }

输出单链表

只要将我们的每一个链表data数据打印即可

    public void print(){
        LinkNode current = head;
        while (current != null){
            System.out.print(current.data + "->");
            current = current.next;
        }
        System.out.println("null");
    }

查找单链表数据元素对应的索引值

该运算在单链表中从头开始找需要的数据元素,若存在这样的结点,返回其对应的索引值,如果没找到返回-1。

    public int find(int e){
        LinkNode current = head;
        int index = 0;
        while (current != null){
            if(current.data == e){
                return index;
            }
            current = current.next;
            index++;
        }
        return -1;
    }
    public void get(int e){
        int index = find(e);
        System.out.println(index);
    }

删除数据元素

这个方法首先检查链表是否为空,如果为空则直接返回。然后检查头节点是否是要删除的值,如果是,就将头节点指向下一个节点,并结束方法。接下来,我们就要开始遍历链表,直到找到要删除的节点的前一个节点或者到达链表末尾。如果找到了要删除的节点并且要删除的结点的下一个结点不为空,就将该节点的前一个节点的next指向要删除节点的下一个节点,从而跳过要删除的节点。这样,被删除的节点就不再链表中了。
在这里插入图片描述

    public void remove(int e){
        LinkNode current = head;
        if(head == null){
            return;
        }
        if(head.data == e){
            head = head.next;
            return;
        }
        while (head.next != null && head.next.data != e){
            current = current.next;
        }
        if(current.next != null){
            current.next = current.next.next;
        }
    }

总代码

class LinkNode{
    int data;
    LinkNode next;
    LinkNode(int e){
        data = e;
        next = null;
    }
}


public class LinkedList {
    private LinkNode head;
    public LinkedList(){
        head = null;
    }
    //插入
    public void add(int e){
        if(head == null){
            head = new LinkNode(e);
        }else {
            LinkNode current = head;
            while (current.next != null){
                current = current.next;
            }
            current.next = new LinkNode(e);
        }
    }
    //长度
    public static int ListLength(LinkNode head){
        int length = 0;
        LinkNode current = head;
        while (current != null){
            length++;
            current = current.next;
        }
        return length;
    }
    public void List_Length(){
        int length = ListLength(head);
        System.out.println(length);
    }
    //输出
    public void print(){
        LinkNode current = head;
        while (current != null){
            System.out.print(current.data + "->");
            current = current.next;
        }
        System.out.println("null");
    }
    //查找
    public int find(int e){
        LinkNode current = head;
        int index = 0;
        while (current != null){
            if(current.data == e){
                return index;
            }
            current = current.next;
            index++;
        }
        return -1;
    }
    public void get(int e){
        int index = find(e);
        System.out.println(index);
    }
    //删除
    public void remove(int e){
        LinkNode current = head;
        if(head == null){
            return;
        }
        if(head.data == e){
            head = head.next;
            return;
        }
        while (head.next != null && head.next.data != e){
            current = current.next;
        }
        if(current.next != null){
            current.next = current.next.next;
        }
    }
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.print();
        list.List_Length();
        list.get(2);
        list.remove(2);
        list.print();
    }
}

运训效果:
在这里插入图片描述

结语

本次分享就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区留言,如果给小伙伴们带来了一些收获,请留下你的小赞,你的点赞和关注将会成为博主分享每日学习的动力。

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

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

相关文章

「AI得贤招聘官」通过首批“AI产业创新场景应用案例”评估

近日,上海近屿智能科技有限公司的「AI得贤招聘官」,经过工业和信息化部工业文化发展中心数字科技中心的严格评估,荣获首批“AI产业创新场景应用案例”。 据官方介绍,为积极推进通用人工智能产业高质量发展,围绕人工智能…

HCNA VRP基础

交换机可以隔离冲突域,路由器可以隔离广播域,这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中,网络设备的负担也越来越重,这时网络设备可以通过专有的VRP系统来提升运行效率。通过路由平台VRP是华为公司数…

Large Language Model系列之二:Transformers和预训练语言模型

Large Language Model系列之二:Transformers和预训练语言模型 1 Transformer模型 Transformer模型是一种基于自注意力机制的深度学习模型,它最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出,主要用于机器翻译任务。随…

mac安装win10到外接固态硬盘

1、制作win10系统 1.1 下载 winToUSB,打开后选择第一个 1.2 选择本地下载镜像, 我用的分区方案是适用于UEFI的GPT模式 1.3 点右下角执行,等待执行完成即可 2、mac系统下载win驱动 2.1 comman空格 搜索启动转换助理,打开后选择…

Linux shell编程学习笔记64:vmstat命令 获取进程、内存、虚拟内存、IO、cpu等信息

0 前言 在系统安全检查中,通常要收集进程、内存、IO等信息。Linux提供了功能众多的命令来获取这些信息。今天我们先研究vmstat命令。 1.vmstat命令的功能、用法、选项说明和注意事项 1.1 vmstat命令的功能 vmstat是 Virtual Meomory Statistics(虚拟内…

React 实现五子棋

简介 本文将会基于React 实现五子棋小游戏&#xff0c;游戏规则为先让5颗棋子连成1线的一方获胜。 实现效果 技术实现 页面布局 <div><table style{{border: 1px solid #000, borderCollapse: collapse, backgroundColor: lightgray}}><tbody>{squares.ma…

在 Windows 上运行 Linux:WSL2 完整指南(一)

系列文章目录 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;一&#xff09;&#x1f6aa; 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;二&#xff09; 文章目录 系列文章目录前言一、什么是 WSL&#xff1f;1.1 WSL 的主要特性1.2 WSL 的…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现&#xff1a;实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

【unity笔记】十、Obi绳索插件使用

一. 创建绳索 1.1 新建蓝图 在Assets中右键选择创建->Obi->Rope Blueprint&#xff0c;其属性如图所示 1.2 Obi solver 在场景下创建一个obi solver对象&#xff0c;在该对象下再创建Obi Rope对象。 随后将蓝图拖到Obi Rope对象下的Obi Rope组件&#xff0c;即可看到…

【Web服务与Web应用开发】【C#】VS2019 创建ASP.NET Web应用程序,以使用WCF服务

目录 0.简介 1.环境 2.知识点 3.详细过程 1&#xff09;创建空项目 2&#xff09;添加Web表单 3&#xff09;使用Web表单的GUI设计 4&#xff09;添加服务引用 5&#xff09;在Web的button函数中调用服务&#xff0c;获取PI值 6&#xff09;测试 0.简介 本文属于一个…

环境配置|PyCharm——Pycharm本地项目打包上传到Github仓库的操作步骤

一、Pycharm端的设置操作 通过Ctrl+Alt+S快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,在Git可执行文件路径中,输入Git.exe。 按照下图顺序,依次点击,完成测试。输出如图标④的结果,即可完成测试。 输出下图结果,配置Git成功,如本地未安装Git,需自行安装。

设计模式9-工厂模式(Factory Method)

[TOC](工厂模式(Factory Method)) 写在前面 对象创建模式 通过对象超级模式绕开。动态内存分配&#xff08;new)&#xff0c;来避免对象创建过程中所导致的紧耦合(依赖具体类)&#xff0c;从而支持对象创建的稳定&#xff0c;它是结构抽象之后的第一步工作。 典型模式&…

新版本安卓更换下载源解决gradle时间太久问题

老版本android studio 解决方法如下 : android studio gradle:build model执行时间太久 最近又做到安卓的任务了,下载的安卓studio最新版 这个版本的android studio 不能用上面那种老版本的方法了,需要更新方法 新版本需要跟换两个地方 gradle/wrapper/gradle-wrapper.proper…

JAVA 异步编程(异步,线程,线程池)一

目录 1.概念 1.1 线程和进程的区别 1.2 线程的五种状态 1.3 单线程,多线程,线程池 1.4 异步与多线程的概念 2. 实现异步的方式 2.1 方式1 裸线程&#xff08;Thread&#xff09; 2.1 方式2 线程池&#xff08;Executor&#xff09; 2.1.1 源码分析 2.1.2 线程池创建…

三丰云评测:免费虚拟主机与免费云服务器体验

今天我来为大家分享一下我对三丰云的评测。作为一家知名的云服务提供商&#xff0c;三丰云一直以来备受用户好评。他们提供免费虚拟主机和免费云服务器服务&#xff0c;深受网站建设者和开发者的喜爱。 首先谈谈免费虚拟主机服务。三丰云的免费虚拟主机方案性价比非常高&#x…

代码随想录算法训练营第33天|LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

1. LeetCode 509. 斐波那契数 题目链接&#xff1a;https://leetcode.cn/problems/fibonacci-number/ 文章链接&#xff1a;https://programmercarl.com/0509.斐波那契数.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1f5411K7mo 思路&#xff1a; 动态规划步骤…

django-ckeditor富文本编辑器

一.安装django-ckeditor 1.安装 pip install django-ckeditor2.注册应用 INSTALLED_APPS [...ckeditor&#xff0c; ]3.配置model from ckeditor.fields import RichTextFieldcontent RichTextField()4.在项目中manage.py文件下重新执行迁移&#xff0c;生成迁移文件 py…

jvm优化

1.jvm组成 什么是jvm&#xff0c;java是跨平台语言&#xff0c;对不同的平台&#xff08;windos&#xff0c;linux&#xff09;&#xff0c;有不同的jvm版本。jvm屏蔽了平台的不同&#xff0c;提供了统一的运行环境&#xff0c;让java代码无需考虑平台的差异。 jdk包含jre包含…

ValueError和KeyError: ‘bluegrass’的问题解决

项目场景&#xff1a; 项目相关背景&#xff1a; 问题描述 遇到的问题1&#xff1a; KeyError: ‘bluegrass’ 不能识别某标签 遇到的问题2&#xff1a; xml etree.fromstring(xml_str) ValueError: Unicode strings with encoding declaration are not supported. Please …

K8S POD控制器:从基础到高级实战技巧

一、引言 在当今的云计算时代&#xff0c;Kubernetes&#xff08;K8s&#xff09;已成为最受欢迎的容器编排工具&#xff0c;它的核心组成部分之一——K8s POD控制器&#xff0c;扮演着至关重要的角色。这篇文章旨在深入探讨K8s POD控制器的内部工作原理、不同类型及其应用场景…