【数据结构】链表(2)

news2024/9/29 11:28:32

 【LinkedList的模拟实现】

这是java中的一个集合类,可以当成链表来使用,作为链表时,它视为包含三个域,是一个双向链表

【构建LinkedList框架】

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

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

    public ListNode head;//标志头节点
    public ListNode last;//标志尾节点
}

【得到双向链表的长度】

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

【打印双向链表的值】

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

【查找关键字key是否在链表中】

public boolean containsKey(int key)
    {
        ListNode cur = head;
        while(cur != null) 
        {
            if (cur.val == key) 
            {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

【头插法】

1.链表不为null时,node的next域中存放head指向的节点地址(node.next = head)

2.head的prev域中存放node指向的节点地址(head.prev = node)

3.head指向node(head = node)

 public void addFirst(int data)
    {
        ListNode node = new ListNode(data);
        if(head == null)//判断是否是首次插入节点
        {
            head = last = node;
        }else
        {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }

【尾插法】

1.链表不为null时,last所指向节点的next域中存放node指向的节点地址(last.next = node)

2.node的prev域中存放last指向的节点地址(node.prev = last)

3.last指向node(last = node )(或者last = last.next)

 public void addLast(int data)
    {
        ListNode node = new ListNode(data);
        if(head == null)//判断是否是首次插入节点
        {
            head = last = node;
        }else
        {
            last.next = node;
            node.prev = last;
            last = node; //last = last.next;
        }
    }

【任意位置插入】

单链表时如果想插2位置,需要找到2的前一个节点,相当于要定义一个cur,走到目标位置的前一个节点,但双向链表是可以通过prev直接知道前一个节点的地址的

1.直接记录index位置的节点cur

2.node的next域被设置为cur指向的节点地址(node.next = cur)

3.cur的前驱节点中的next域被设置为cur指向的节点地址(cur.prev.next = node)

4.node的prev域被设置为cur前驱中所存放的节点地址(node.prev = cur.prev)

5.cur的prev域被设置为node指向的节点地址(cur.prev = node)

 public void addIndex(int index, int data)
    {
        //1.判断index的合法性
        try {
            checkIndex(index);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //2.index == 0 || index == size()
        if(index == 0)
        {
            addFirst(data);
            return;
        }
        if(index == size())
        {
            addLast(data);
            return;
        }
        //3.找到index位置
        ListNode cur = findIndex(index);
        ListNode node = new ListNode(data);
        //4.进行链接
        node.next = cur;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;

    }

    private ListNode findIndex(int index)//找到index位置
    {
       ListNode cur = head;
       while(index != 0)
       {
           cur = cur.next;
           index--;
       }
       return cur;
    }

    private void checkIndex(int index) throws InterruptedException//检查index是否合法
    {
        if(index < 0 || index > size())
        {
            throw new IndexNotLegalException("index不合法");
        }
    }

【删除关键字为key的节点】

1.找到关键字key所在的节点cur

2.cur前驱节点的next域被设置为cur的next域中所存放的节点地址(cur.prev.next = cur.next)

3.cur后继节点的prev域被设置为cur的prev域中所存放的节点地址(cur.next.prev = cur.prev)

public void remove(int key)
    {
        ListNode cur = head;
        while(cur.next != null)
        {
            if(cur.val == key)
            {
                if(cur == head)//处理头节点
                {
                    head = head.next;
                    if(head != null)
                    {
                        head.prev = null;
                    }else//head为null,证明只有一个节点
                    {
                        last = null;
                    }
                }else
                {
                    cur.prev.next = cur.next;
                    if (cur.next == null)//处理尾节点
                    {
                        last = last.next;
                    } else {
                        cur.next.prev = cur.prev;
                        return;
                    }
                }
                }
            cur = cur.next;
        }
    }

【清空链表】

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

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

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

相关文章

Qt/C++如何选择使用哪一种地图内核/不同地图的优缺点/百度高德腾讯地图/天地图/谷歌地图

一、前言说明 最近花了大半年时间&#xff0c;专门研究这个地图组件&#xff0c;几乎把各种地图的官网的手册翻了个遍&#xff0c;亲自写代码验证了一遍&#xff0c;各种API函数接口和功能全部实战一遍&#xff0c;然后从中提取共性&#xff0c;做出了基类&#xff0c;以及通用…

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中&#xff0c;数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具&#xff0c;通过简单的拖拽操作&#xff0c;你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…

改善大模型 RAG 效果:结合检索和重排序模型

最近这一两周不少大厂都已经开始秋招面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&am…

【含文档】基于Springboot+Vue的个人博客系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

【吊打面试官系列-MySQL面试题】优化MySQL数据库的方法?

大家好&#xff0c;我是锋哥。今天分享关于【优化MySQL数据库的方法?】面试题&#xff0c;希望对大家有帮助&#xff1b; 优化MySQL数据库的方法? 1、选取最适用的字段属性&#xff0c;尽可能减少定义字段宽度&#xff0c;尽量把字段设置 NOTNULL&#xff0c; 例如’省份’、…

大数据新视界 --大数据大厂之基于 MapReduce 的大数据并行计算实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【SpringBoot详细教程】-07-整合Thymeleaf模板引擎与静态资源【持续更新】

关注点一点&#xff0c;友谊深一点 &#x1f332; 静态资源访问 在我们开发web应用的时候&#xff0c;需要引入大量的js、css、图片等静态资源。 默认配置 SpringBoot 默认提供的静态资源目录位置需要置于classpath下&#xff0c;目录名需要符合如下规则&#xff1a; /stat…

用ChatGPT做数据分析与挖掘,爽啊

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题

在前面几篇文章中&#xff0c;我们讲了一些跟重构相关的理论知识&#xff0c;比如&#xff1a;持续重构、单元测试、代码的可测试性、解耦、编码规范。用一句话总结一下&#xff0c;重构就是发现代码质量问题&#xff0c;并且对其进行优化的过程。 前面的内容相对还是偏理论。…

笔记本维修与拆解(一)

清灰&#xff1a; 拆螺丝: 拔掉电池供电&#xff1a; 多按几次开机键&#xff0c;放电&#xff1a; 涂抹硅胶的时候&#xff0c;千万不要涂很多&#xff0c;溢出CPU&#xff0c;如果硅胶溢到焊盘上去的话很容易热胀冷缩短路 【联想拯救者Y9000P和R9000P最简单清灰教程&#xf…

2024年7月大众点评全国美发前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时&#xff0c;大众点评的数据参考价值非常大&#xff0c;截至2024年7月&#xff0c;大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

「Python入门」vscode的安装和python插件下载

粗浅之言&#xff0c;如有错误&#xff0c;欢迎指正 文章目录 前言Python安装VSCode介绍VSCode下载安装安装python插件 前言 Python目前的主流编辑器有多个&#xff0c;例如 Sublime Text、VSCode、Pycharm、IDLE(安装python时自带的) 等。个人认为 vscode 虽然在大型项目上有…

创新大赛:如何在国赛现场赛中脱颖而出?

创新大赛&#xff1a;如何在国赛现场赛中脱颖而出&#xff1f; 前言创意与可行性问题定义讲故事商业价值数据支撑简化表达总结结语 前言 在当今这个快速变化的时代&#xff0c;创新已成为推动社会进步的重要动力。无论是科技、教育、医疗还是日常生活的方方面面&#xff0c;创新…

护眼落地灯到底有没有用?五款好用护眼落地灯分享

护眼落地灯到底有没有用&#xff1f;护眼落地灯既适合日常照明使用&#xff0c;又适合学生以及办公人群使用的一种护眼神器&#xff0c;因此热度一直都很高。但是该行业内的产品也很复杂&#xff0c;其中还有一些劣质不专业的产品掺杂在其中&#xff0c;不但照明效果不佳&#…

SpringBoot集成Matlab软件实战

在项目中处理矩阵等复杂数据结构的时候&#xff0c;可以用Matlab程序来运行&#xff0c;其优点是很多的。 专用工具箱和强大的矩阵运算能力&#xff1a;MATLAB 拥有强大的数学工具箱和优化工具箱&#xff0c;适合处理大规模矩阵运算以及水文模型的率定。MATLAB 的 Optimization…

关于HTML 案例_个人简历展示02

展示效果 用table进行布局label 标签进行关联 例如&#xff1a;点姓名就可以到text中去填写内容 input的使用 text 文本框radio 单选框select与option 选择框checkbox 复选框 textareaul与li 无序列表文中图片是本地的 链接: 图片下载地址 代码 <!DOCTYPE html> <…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》例10-9

灰度共生矩阵的相关性 相关性&#xff08;Correlation&#xff09; 公式 Correlation ∑ i 1 N g ∑ j 1 N g ( i − μ x ) ( j − μ y ) P ( i , j ) σ x σ y \text{Correlation} \frac{\sum_{i1}^{N_g} \sum_{j1}^{N_g} (i - \mu_x)(j - \mu_y) P(i,j)}{\sigma_x \…

基于elasticsearch存储船舶历史轨迹: 使用scroll滚动技术实现大数据量搜索

文章目录 引言I 轨迹索引的设计轨迹文档定时创建索引手动添加索引并为索引添加别名POST请求批量插入文档数据II 查询文档数据基于scroll滚动技术实现大数据量搜索查询轨迹查询参数返回dtoIII 知识扩展术语介绍基于 search_after 实现深度分页引言 需求: 存储轨迹,提供站点查…

获取用户openId存入数据库⑤

这一篇数微信公众号开发的第五篇&#xff0c;如果你是小白请点击下方第一篇的链接&#xff1a; 微信公众号开发-接口配置信息&#xff08;第①篇&#xff09;-CSDN博客 先获取token&#xff0c;代码&#xff1a; <?php //获取token $appId wx08888888888888888888; //改…

【代码】Zotero|用文章标题更新 Zotero 的参考文献引用条目信息的 Quicker 动作

如题。 目前只支持期刊和会议文章&#xff0c;并且只支持谷歌学术或 DBLP 能搜到的文章&#xff0c;知网的不支持&#xff0c;如果有人有需要我可以去试着写&#xff0c;但我很懒我看大家也没这个需求。 很早就写完了&#xff0c;一直忘记推了。 刚写完的时候心情是很激动的&a…