【数据结构】链式存储:链表(无头双向链表实现)

news2024/12/23 0:23:47

目录

🥇一:无头双向链表

🎒二、无头双向链表的实现

📘1.创建节点类

📒2.创建链表

📗3.打印链表

📕4.查找是否包含关键字key是否在单链表当中

📙5.得到单链表的长度

📒6.任意位置插入,第一个数据节点为0号下标

📘7.删除第一次出现关键字为key的节点

📗8.删除所有值为key的节点

📕9.清空链表


🥇一:无头双向链表

🎒二、无头双向链表的实现

📘1.创建节点类

🌈节点由val域(数据域),prev(前驱),next(后继),对于prev域,其是引用类型,存放上一个节点的地址;对于next域,其是引用类型,存放下一个节点的地址。

    static class ListNote {
        public int val;
        public ListNote prev;//前驱
        public ListNote next;//后继

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

📒2.创建链表

1️⃣头插法:头插法是指在链表的头节点的位置插入一个新节点,定义一个node表示该节点,然后就是对node的next进行赋值

 此时我们需要用到prev(前驱),如图所示:

双向链表和单向链表有一点不同的是:双向链表会有一个改良——会新增一个引用(last:永远指向最后一个节点),如果只有一个节点,那么head和last同时指向这个节点

新增的最后一个节点的好处就是:在进行尾插法的时候直接可以找到尾部进行插入

    public ListNote last;//定义最后一个节点
    //头插法
    public void addFirst(int data){
        ListNote node = new ListNote(data);
        if(head == null) {
            head = node;
            last = node;
        }else {
            node.next = head;
            head.prev = node;
            node = head;
        }
    }

3️⃣尾插法:尾插法是指在链表的尾节点的位置插入一个新节点,定义一个node表示该节点,然后就是对原来最后一个节点的next进行赋值。

🔑如果只有一个节点,即node=head=last;如果多个节点在最后插入需要改两个数据,如图所示

📗3.打印链表

➡️为了使head一直存在且有意义,我们在display()函数中定义一个cur:Node cur = head;来替代head。

    public void display(){
        ListNote cur = head;
        if(cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

❓做在这里我们并没有使用到prev(前驱),即如果用不到就不需要使用了

📕4.查找是否包含关键字key是否在单链表当中

    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
        ListNote cur = head;
        while (cur != null) {
            if(cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

📙5.得到单链表的长度

    //得到单链表的长度
    public int size(){
        int len = 0;
        ListNote cur = head;
        if (cur != null) {
            len++;
            cur = cur.next;
        }
        return len;
    }

📒6.任意位置插入,第一个数据节点为0号下标

1️⃣首先,在头部插入一个节点——头插法;2️⃣在最后一个位置插入——尾插法

3️⃣在中间位置插入,需要改变4个位置,如图所示

    //任意位置插入,第一个数据节点为0号下标
    public void addIndex(int index,int data){
        if(index < 0 || index > size()) {
            throw new ListIndexOutOfExpection();
        }
        if(index == 0) {
            addFirst(data);
            return;
        }
        if(index == size()) {
            addLast(data);
            return;
        }
        ListNote cur = findIndex(index);
        ListNote node = new ListNote(data);
        node.next = cur;
        cur.prev.next = node;
        //注意顺序不能变
        node.prev = cur.prev;
        cur.prev = node;
    }

    private ListNote findIndex(int index) {
        ListNote cur = head;
        while (index != 0) {
            cur = cur.next;
            index--;
        }
        return cur;
    }

📘7.删除第一次出现关键字为key的节点

1️⃣首先,删除头节点:head = head.next;;2️⃣在删除中间和尾巴节点时,如图所示

    //删除第一次出现关键字为key的节点
    public void remove(int key){
        ListNote cur = head;
        while (cur != null) {
            //开始删除
            if(cur.val == key) {
                //1.删除头节点
                if(cur == head) {
                    head = head.next;
                    //只有一个节点
                    if(head != null) {
                        head.prev = null;
                    }
                }else {
                    //中间  尾巴
                    cur.prev.next = cur.next;
                    //不是尾巴节点
                    if(cur.next != null) {
                        cur.next.prev = cur.prev;
                    }else {
                        //是尾巴节点
                        last = last.next;
                    }
                }
                return;
            }
            cur = cur.next;
        }
    }

📗8.删除所有值为key的节点

    //删除所有值为key的节点
    public void removeAllKey(int key){
        ListNote cur = head;
        while (cur != null) {
            //开始删除
            if(cur.val == key) {
                //1.删除头节点
                if(cur == head) {
                    head = head.next;
                    //只有一个节点
                    if(head != null) {
                        head.prev = null;
                    }
                }else {
                    //中间  尾巴
                    cur.prev.next = cur.next;
                    //不是尾巴节点
                    if(cur.next != null) {
                        cur.next.prev = cur.prev;
                    }else {
                        //是尾巴节点
                        last = last.next;
                    }
                }
            }
            cur = cur.next;
        }
    }

📕9.清空链表

🔑双向列表不可以把头和尾置为null;需要把每个节点都置为null

➡️定义一个cur:ListNode cur = head;在定义一个curNext,为了方便到找cur的下一个链表,并且置为null

    public void clear(){
        ListNote cur = head;
        while (cur != null) {
            ListNote curNext = cur.next;
            cur.prev = null;
            cur.next = null;
            cur = curNext;
        }
        head = null;
        last = null;
    }

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

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

相关文章

PCL中常用的高级采样方法

0. 简介 我们在使用PCL时候&#xff0c;常常不满足于常用的降采样方法&#xff0c;这个时候我们就想要借鉴一些比较经典的高级采样方法。这一讲我们将对常用的高级采样方法进行汇总&#xff0c;并进行整理&#xff0c;来方便读者完成使用 1. 基础下采样 1.1 点云随机下采样 …

代码随想录拓展day6 N皇后

代码随想录拓展day6 N皇后 只有这一个内容。一刷的时候也没弄太明白&#xff0c;二刷的时候补上。还有部分内容来自牛客网左老师的算法课程。 总体思路不容易想明白&#xff0c;优化也有很大难度。这要是面试能碰上基本就是故意不给过了吧。 思路 首先来看一下皇后们的约束…

Flink 容错恢复 2.0 2022 最新进展

摘要&#xff1a;本文整理自阿里云 Flink 存储引擎团队负责人&#xff0c;Apache Flink 引擎架构师 & PMC 梅源在 FFA 核心技术专场的分享。主要介绍在 2022 年度&#xff0c;Flink 容错 2.0 这个项目在社区和阿里云产品的进展&#xff0c;内容包括&#xff1a;Flink 容错恢…

基于ssm的个人健康管理系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

简单理解光会产生折射的原因及折射定律的推导

已知 1、光是一种波&#xff1b; 2、光在不同介质中传播速度不同。 构建模型 如下图所示&#xff0c;光是中电磁波&#xff0c;以余弦波为例&#xff0c;取余弦波的极大值点为参考&#xff0c;建立一个平面波&#xff08;波前为一个平面&#xff09;。能明显的看出光的传播方…

树形结构——二叉树

前言 前面的章节我们介绍了两种重要的数据结构&#xff0c;数组和链表&#xff0c;由于他们各自的特性使得他们的优缺点非常分明&#xff0c;在查询速度和插入速度上顾此失彼&#xff0c;不能兼顾&#xff0c;那么有没有一种数据结构可以同时高效的完成插入和查询操作呢&#x…

专访 | 刘嘉松:开源,互惠且共赢

本文整理自对 2022 开源之夏 OpenMLDB 社区贡献者刘嘉松同学的采访&#xff0c;欢迎大家关注~ OpenMLDB&#xff1a;可以先请你介绍一下你自己吗? 刘嘉松&#xff1a;我叫刘嘉松&#xff0c;是中南大学计科专业的一名本科生&#xff0c;目前大四&#xff0c;未来将继续在中南…

Hello 2023 D. Boris and His Amazing Haircut

原题链接&#xff1a;Problem - D - Codeforces 题意&#xff1a; 给定长度为 n 的数组 A &#xff0c;代表 Boris 现在的头发长度&#xff0c;和一个长度为 n 的数组 B &#xff0c;代表他希望的发型的头发长度。理发师手里有 m 把剪刀&#xff0c;每个都只能用一次&#xff…

计算机硕士论文,盲审的老师都很严吗? - 易智编译EaseEditing

首先&#xff0c;学位论文必须论证严谨 对于一个结果的解读&#xff0c;先老老实实的把得到什么结果讲一遍&#xff0c;基于这个所得出的结论说一说&#xff0c;最后&#xff0c;来个非谓语的短句吹一吹重要性或提示意义。 这其实是有套路的一个句子写下来。但是&#xff0c;在…

AC7811-ACMP模拟比较器

在无感的BLDC方波控制中&#xff0c;AC7811没办法再直接通过PWDT模块检测霍尔信号了。 所以需要先进行ACMP模块的初始化配置&#xff0c;使能ACMP模块正常工作后&#xff0c;ACMP会对输入的三相反电动势与电机中电电压进行轮询模拟&#xff0c;得到各相反电动势过零点&#xf…

分享5款有趣但或许不那么实用的软件

今天我想分享几个有趣但或许不那么实用的软件&#xff0c;各位喜欢的朋友可以自行下载呢。 1.软件音量设置——EarTrumpet 听音乐、看视频、玩游戏&#xff0c;在各应用切换过程中&#xff0c;你可能会频繁调整系统音量大小&#xff0c;以适应自己的耳朵。而 EarTrumpet 则可…

AIGC:BAT、抖快的新掘金口?

配图来自Canva可画 AI辅助绘画估值超十万&#xff1f; 12月28日&#xff0c;山东人民出版社看中一位4岁女孩用百家号AI作画创作的AI绘本《超能外星战队》&#xff0c;认为该画价值超十万元且有出版意向。与此同时&#xff0c;“AI作画”像病毒般在各大短视频平台蔓延&#xf…

年度盘点丨2022年,7大关键词彰显用友成长型企业数智力量

导读&#xff1a;这一年&#xff0c;他们用卓越成绩证明自己&#xff0c;用产品创新回馈客户&#xff0c;用实力开启了中国成长型企业数智化产业的逆袭之路&#xff01; 2022年&#xff0c;企业级数智化产业经历了翻天覆地的变化。 曾经万家追捧的“舶来品”在成长型企业的主…

项目管理中,如何对各种文件进行统一版本管理?

不知道你在工作中是否也遇到过这样的问题&#xff1a;1、文件先存一个位置&#xff0c;等晚点再整理&#xff0c;结果过了一段时间&#xff0c;就变成了这样&#xff1a;2、想从电脑中找一份重要材料&#xff0c;要花费很长时间&#xff0c;有时查找一通&#xff0c;却一无所获…

Docker中MySQL主从复制

MySQL主从复制 主从搭建步骤 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD…

SAP年结账务调整过程中的业务改错处理心得

昨天遇到一个问题在这里分享一下。大家知道刚刚跨年&#xff0c;财务还在做一些后续调整。在业财一体化的系统中&#xff0c;这种调整往往涉及到两个方向&#xff0c;财务端去调&#xff0c;还是业务端去调。但大家要了解一个前提。即然需要做调整&#xff0c;肯定是业务端出错…

IPC(IP CAMERA)

IPC是IP Camera的缩写词&#xff0c;IP是网际协定&#xff0c;Camera是照相机、摄影机&#xff0c;IP Camera顾名思义就是网路摄像机&#xff0c;它是一种由传统摄像机与网路技术结合所产生的新一代摄像机。 注&#xff1a;NVR&#xff0c;全称Network Video Recorder&#xff…

有哪些设备管理软件值得推荐?

有哪些设备管理软件值得推荐&#xff1f; 别滑了&#xff0c; 翻遍全网&#xff0c;好用的设备管理软件都给你整理好了&#xff0c;白嫖的好事可千万别错过。 要知道好用的设备管理软件&#xff0c;可是能为企业持续、稳定、快速发展&#xff0c;及提高经济效益发挥重要作用。…

机器学习实战教程(九):支持向量机实战篇

一、前言 上篇文章讲解的是线性SVM的推导过程以及简化版SMO算法的代码实现。本篇文章将讲解SMO算法的优化方法以及非线性SVM。 本文出现的所有代码&#xff0c;均可在我的github上下载&#xff0c;欢迎Follow、Star&#xff1a;点击查看 二、SMO算法优化 在几百个点组成的小规…

数据的存储

数据的存储 文章目录数据的存储一、数据类型二、整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3几个经典关于内存存储的例子三、浮点型在内存中的存储3.1 一个令你惊呆的例子3.2 浮点数存储规则一、数据类型 整形家族&#xff1a; char&#xff1a; unsigned char&a…