【2】单链表

news2025/2/2 22:45:31

【2】单链表

  • 1、单链表
  • 2、单链表的设计
  • 3、接口设计
  • 4、SingleLinkedList
  • 5、node(int index) 返回索引位置的节点
  • 6、clear()
  • 7、添加
  • 8、删除
  • 9、indexOf(E element)

1、单链表

📕动态数组有个明显的缺点
🖊 可能会造成内存空间的大量浪费
📕 能否用到多少就申请多少内存?
🖊 链表可以办到这一点

📕 链表是一种链式存储的线性表,所有元素的内存地址不一定连续
在这里插入图片描述

🖊 每个节点中有一个成员变量指记录着下一个节点的内存地址

2、单链表的设计

在这里插入图片描述

🍀 size 存储单链表的节点个数
🍀 first 被称作头指针:指向头节点
🍀 每个节点(Node)中有 element 属性存储具体的数据;next 属性存储下一个节点的内存地址
🍀 尾节点的 next 属性为 null
🍀 单链表也是线性表(有索引的概念)

3、接口设计

📕 链表的大部分接口和动态数组是一致的
在这里插入图片描述

在这里插入图片描述

public interface List<E> {
    /**
     * 返回存储的元素数量
     */
    int size();

    /**
     * 是否为空
     */
    boolean isEmpty();

    /**
     * 是否包含给定元素
     */
    boolean contains(E element);

    /**
     * 返回索引位置的元素
     */
    E get(int index);

    /**
     * 返回指定元素的索引
     */
    int indexOf(E element);

    /**
     * 添加元素到尾部
     */
    void add(E element);

    /**
     * 往索引位置添加元素
     */
    void add(int index, E element);

    /**
     * 删除索引位置的元素
     *
     * @return 被删除的元素
     */
    E remove(int index);

    /**
     * 清空所有元素
     */
    void clear();

    /**
     * 设置索引位置的元素
     */
    E set(int index, E element);
}

4、SingleLinkedList

在这里插入图片描述

📕往单链表中添加一个数据就会创建的一个 Node 对象

public class SingleLinkedList<E> implements List<E> {
    private int size;
    private Node<E> first;

    /**
     * 返回存储的元素数量
     */
    @Override
    public int size() {
        return 0;
    }

    /**
     * 是否为空
     */
    @Override
    public boolean isEmpty() {
        return false;
    }

    /**
     * 是否包含给定元素
     */
    @Override
    public boolean contains(E element) {
        return false;
    }

    /**
     * 返回索引位置的元素
     */
    @Override
    public E get(int index) {
        return null;
    }

    /**
     * 返回指定元素的索引
     */
    @Override
    public int indexOf(E element) {
        return 0;
    }

    /**
     * 添加元素到尾部
     */
    @Override
    public void add(E element) {

    }

    /**
     * 往索引位置添加元素
     */
    @Override
    public void add(int index, E element) {

    }

    /**
     * 删除索引位置的元素
     *
     * @return 被删除的元素
     */
    @Override
    public E remove(int index) {
        return null;
    }

    /**
     * 清空所有元素
     */
    @Override
    public void clear() {

    }

    /**
     * 设置索引位置的元素
     */
    @Override
    public E set(int index, E element) {
        return null;
    }

    private static final class Node<E> {
        private E element;
        private Node<E> next;

        public Node(E element, Node<E> next) {
            this.element = element;
            this.next = next;
        }
    }

}

5、node(int index) 返回索引位置的节点

在这里插入图片描述

🖊 若需要 index 位置的节点,则从 first 头指针指向的头节点开始 next index 次即可

	/**
	 * 返回index索引处的节点
	 */
	private Node<E> node(int index) {
	    checkIndex(index);
	
	    Node<E> node = first;
	    for (int i = 0; i < index; i++) {
	        node = node.next;
	    }
	    return node;
	}

📕 get(int index) 方法

    /**
     * 返回索引位置的元素
     */
    @Override
    public E get(int index) {
        return node(index).element;
    }

📕 set(int index, E element) 方法

    /**
     * 设置索引位置的元素
     */
    @Override
    public E set(int index, E element) {
        Node<E> node = node(index);
        E e = node.element;
        node.element = element;
        return e;
    }

6、clear()

在这里插入图片描述

🖊 first 头指针指向 null,则头节点会被Java的垃圾回收器回收
🖊 头节点的内存被回收会导致它 next 指向的节点也被回收,最终整个链表就被清空了

    /**
     * 清空所有元素
     */
    @Override
    public void clear() {
        first = null;
        size = 0;
    }

7、添加

在这里插入图片描述

🖊 如果 index == 0(把元素添加到头节点位置):直接让 first 头指针指向新节点,新节点的 next 指向之前的头节点
🖊 如果 index != 0:① 找到 index - 1 索引处的节点 prev;② 新节点的 next 指向 prev.next;③ prev.next 指向新节点

   * 往索引位置添加元素
     */
    @Override
    public void add(int index, E element) {
        checkIndex4Add(index);

        if (index == 0) {
            first = new Node<>(element, first);
        } else {
            Node<E> prev = node(index - 1);
            prev.next = new Node<>(element, prev.next);
        }
        size++;
    }

📕 在编写链表代码时,要注意边界测试,比如 index 为 0size – 1size

边界介绍
0往头节点位置添加元素
size-1边界检查通过
size往链表尾部添加元素
    /**
     * 添加元素到尾部
     */
    @Override
    public void add(E element) {
        add(size, element);
    }

8、删除

在这里插入图片描述

🖊 如果 index == 0(删除头节点元素):直接用头指针 first 指向 first.next
🖊 如果 index != 0:① 找到前一个节点 prev;② prev.next 指向 prev.next.next

    /**
     * 删除索引位置的元素
     *
     * @return 被删除的元素
     */
    @Override
    public E remove(int index) {
        checkIndex(index);

        Node<E> node = first;
        if (index == 0) {
            first = first.next;
        } else {
            Node<E> prev = node(index - 1);
            node = prev.next;
            prev.next = node.next;
        }

        size--;
        return node.element;
    }

📕 在编写链表代码时,要注意边界测试,比如 index 为 0size – 1size

边界介绍
0删除头节点
size-1边界检查通过
size抛异常

9、indexOf(E element)

📕 从 first 开始挨个遍历比较
🖊 考虑 element == null 的情况

    /**
     * 返回指定元素的索引
     */
    @Override
    public int indexOf(E element) {
        Node<E> node = first;
        if (element == null) {
            for (int i = 0; i < size; i++) {
                if (node.element == null) return i;
                node = node.next;
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(node.element)) return i;
                node = node.next;
            }
        }

        return ELEMENT_NOT_FOUND;
    }

🍀😀 单链表完整代码

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

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

相关文章

Elementor Pro最新学习版:强大的WordPress页面构建器插件

产品用途 Elementor Pro的核心功能包括拖放编辑器、前端编辑器、实时预览、允许导入和导出模板、支持35预建模板、多种营销工具和插件支持、多种排版选项、能够放置内联元素、Font Awesome图标支持、允许构建移动响应页面、登陆页面构建器、弹出窗口生成器、对评级系统的架构标…

linux 组建raid5详细操作

raid5最多运行损坏一个盘&#xff0c;最少3个盘&#xff0c;容量为少一块硬盘的容量之和。 如果硬盘数量较多&#xff0c;比如8块以上&#xff0c;建议用raid6&#xff0c;raid6最多允许两块硬盘损坏。 如果需要 一、安装raid软件 deb包 apt-get install mdadm或dnf包 dnf …

总结UDP各类知识点

前言 本篇博客博主将详细地介绍UDP有关知识点&#xff0c;坐好板凳发车啦~ 一.UDP特点 1.无连接 UDP传输的过程类似于发短信&#xff0c;知道对端的IP和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b; 2.不可靠传输 没有任何的安全机制&#xff0c;发送端发…

eNSP综合实验(PPP认证、VPN配置、RIP协议、NAT)

题目如上 第一步:配置IP地址 ip分配如下图所示 开始配置IP(PC省略&#xff09; R1&#xff1a; [R1]undo [R1]undo in [R1]undo info-centere [R1]undo info-center e [R1]undo info-center enable Info: Information center is disabled. [R1]int g0/0/0 [R1-Gigabit…

Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理

我用navicat连接我的阿里云服务器的mysql服务器的时候,出现了1130的报错。&#xff08;mysql Server version: 5.7.42-0ubuntu0.18.04.1 (Ubuntu)&#xff09; 我来记录一下这个原因&#xff0c;以及修改过程&#xff01; 1.首先进入mysql -u root -p&#xff0c; mysql客户端…

从 Azure 部署生成本地 .NET 密钥

作者&#xff1a;Frank Boucher 排版&#xff1a;Alan Wang 通常&#xff0c;示例项目以一些“魔术字符串”开始&#xff0c;这些变量包含与部署或外部资源相关的 URL 和关键信息&#xff0c;我们必须更改这些信息才能使用示例。例如在 .NET 中&#xff0c;它可能如下所示&…

SAMRTFORMS 转换PDF 发送邮件

最终成果&#xff1a; *&---------------------------------------------------------------------**& Report ZLC_FIND_EXIT*&---------------------------------------------------------------------**&根据T-CODE / 程序名查询出口、BADI增强*&-------…

建立一个简单的网页音乐盒模型效果#css#h5

“音乐盒”可以看做一个大盒子&#xff0c;用<div>标签进行定义。大盒子的上面为文本内容&#xff0c;可以在<div>标签中嵌套<h2>和<p>标签来实现&#xff1b;大盒子下面为图像&#xff0c;通过在<div>标签中嵌套<img/>标签来实现。 样式…

基于SDXL——ComfyUI下使用Layerdiffusion一键生成透明底图像

ComfyUI下使用Layerdiffusion一键生成透明底图像 一. 安装workspace工作流插件二. 安装、部署、运行Layerdiffusion1. 下载和安装layerdiffusion节点2. 下载LayerDiffusion 处理模型3. 导入工作流4. 开始运行LayerDiffusion4.1 直接生成透明底图像4.2 生成背景&生成前景4.3…

Ubuntu上安装Python3.11-源码编译

1、下载依赖 sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev 2、上传文件 &#xff0c;解压并进入 tar -xf Python-3.11.0.tar.xz 3、编译 cd Pyt…

WordPress分页函数function

1、可以通过下面的代码在编辑器上添加一个分页符按钮。 2、将下面的代码添加到当前主题functions.php即可。 3、代码如下&#xff1a; function mce_page_break($mce_buttons) { $pos array_search(wp_more, $mce_buttons, true); if ($pos ! false) { $buttons …

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2&#xff08;演示对齐规则1、2、3、4&#xff09; 2、为什么存在内存对齐 2.1、平台原因&#xff08;移植原因&#xff09; 2.2、性能原因 2.3、那么如何即满足对齐&#xff0c;又要节省空间呢&#xff1f; …

PTA L2-038 病毒溯源

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而这些变异的病毒又可能被诱发突变产生第二代变异&#xff0c;如此继续不断变化。 现给定一些病毒之间的变异关系&#xff0c;要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的&a…

PS从入门到精通视频各类教程整理全集,包含素材、作业等复发(2)

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 初级教程素材 等文件 https://www.alipan.com/s/fC…

AI计算平台设计方案:901-基于3U VPX的图像数据AI计算平台

一、产品概述 设备基于3U VPX的导冷结构&#xff0c;集成FPGA接口预处理卡&#xff0c;GPU板卡、飞腾ARM处理卡&#xff0c;实现光纤、差分电口或者Camera link的图像接入&#xff0c;FPGA信号预处理&#xff0c;GPU AI计算&#xff0c;飞腾ARM的采集管理存储。 二、系统…

Flutter 使用 AndroidStudio 给(Android 安卓)进行签名方法

一、使用 AndroidStudio 创建签名 使用 AndroidStudio 打开 Flutter项目中的 android 文件夹首次打开 AndroidStudio 会加载一会。菜单栏 &#xff1a; Build -> Generate Signed Bundle APK... 选中 APK -> Next点击Create new....下面按照需求填写即可- 文件夹选择 项…

openPLC_Editor C语言编程 在mp157 arm板上调用io等使用记录

1.编程界面比较简单&#xff0c;具备PLC开发编程的四种编程方式。梯形图语言LD &#xff0c;指令表语言IL&#xff0c;结构化文本语言ST&#xff0c;功能模块图语言FBD。 2.官方使用手册。学习资料实在是太少&#xff0c;目前都是自己比较费劲的研究。 3.2 Creating Your First…

vmWare虚拟机下载安装详细教程,手把手一步一步教学

一.下载 先去官网下载vm 官网地址:https://www.vmware.com/ 官网下载速度太慢了 国内应用商店或者别的下载地址:vmware下载_vmware下载免费中文版客户端[虚拟机]-下载之家 然后再去下载一个镜像 地址是:Index of /centos/7/isos/x86_64/ 我个人下载的是这个 ,看各位的需求…

Reasoning on Graphs: Faithful and Interpretable Large Language Model Reasonin

摘要 大型语言模型(llm)在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;他们在推理过程中缺乏最新的知识和经验幻觉&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式捕获了大量的事实…

linux centos7.9 weblogic14c java1.8.401 安装部署流程

一、获取安装包&#xff1a; Java1.8.401&#xff1a;Java Downloads | Oracle weblogic 14c&#xff1a;https://download.oracle.com/otn/nt/middleware/14c/14110/fmw_14.1.1.0.0_wls_lite_Disk1_1of1.zip 选generic版本 二、将安装包传到Linux服务器上 方法不限&#xf…