数据结构—链表

news2024/11/15 9:39:32

文章目录

  • 链表(头插法、尾插法、单链表反转)
    • 二分查找算法:
    • 哈夫曼编码
  • 构建链表
    • insert()创建链表👇
    • 【1】尾插法
    • 【2】头插法
    • 【3】遍历输出链表
    • 【4】输出链表的长度
    • 【5】查找链表上是否有该元素
    • 【6】指定位置插入数据
  • 链表经典面试题
    • 【1】返回单链表的后k个节点
    • 【2】找到单链表的中间值
    • 【3】判断链表是否成环
    • 【4】判断成环的节点
    • 【5】链表反转

————————————————————————————————

链表(头插法、尾插法、单链表反转)

每一个类是一个对象,
每一个节点的类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
反转链表时注意点:
链表每一个节点必须有指向,否则会被回收

二分查找算法:

二分查找算法:
一个数x先与数组中间的数m比较,
x>m->左边舍弃,m移到右边中间;
x右边舍弃,m移到左边中间;
直接使用Arrays.binarySearch();别忘了引入import java.util.*;
代码如下:
在这里插入图片描述

哈夫曼编码

应用:压缩
不定长编码:每次都需要重新计算编码,有时间开销;不能用于传输
ascII编码是固定的,是定长编码
编码长度由字符种类决定
哈夫曼树:产生不定长编码又不会重复
先统计某个字符出现的频率,任选两个频率最低的生成两个节点;再选两个最小的
在这里插入图片描述
产生树之后,让每个节点的左侧=0,右侧=1(或左侧=1,右侧=0)
在这里插入图片描述

  • 根据0和1和从根节点到某一结点的路径就能哈夫曼编码,哈夫曼编码不定长且不会重复
  • 由于数据都在叶子节点,所以路径都不会出现包含关系
  • 由于选频率最小数据的时候是任选两个,所以会有不同的哈夫曼树,会有不同的哈夫曼编码,但是最终占用存储的结果都是一样的,都是最优树

在这里插入图片描述
使用:存储的时候把数据换成哈夫曼编码
还原字符串:
先看一个比特,看能不能匹配到,不能就看两个比特,找到就还原,找到一个后,后面的编码重复该过程。

构建链表

构建数组(地址连续):int[] arr=newint[]{ };
链表:节点地址不连续
在这里插入图片描述
内存——>构建链表——>如何构建节点
在这里插入图片描述
全局变量,存在对象内部👆
Java中节点表示对象,data记录数据,next记录下一个节点的地址👇
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题:👇
为什么节点域是ListNode类型:(和定义的类名保持一致)—>(需要直到java强数据类型知识)。

  • 因为next区域存储的是当前下一个节点(对象)的地址——>什么才能存储对象的地址——>(ListNode这个类定义的类型存储对象的地址)

👉ListNode node1= new ListNode(1);—>node1变量之所以能存储对象地址,因为ListNode这个类型定义着我们当前这个对象在内存中开辟什么样的内存空间。所以我们当前next变量的类型只能是List Node

  • java的强数据类型:基本上数据类型,引用数据类型——>java为什么定义数据类型——>因为java定义数据类型决定如何开辟内存空间——>定义什么样的数据类型就认为在内存开辟什么样的内存空间(强类型语言在编译时就开辟空间,弱类型语言是在运行期间才开辟空间)

insert()创建链表👇

在这里插入图片描述

  • 创建链表管理对象👇

创建head头节点(ListNode类型全局变量)、创建链表管理对象:链表记录器;

每次调用方法,都会创建节点,第一个节点的地址赋给head,第二个节点的地址赋给第一个节点的next……,每次调用方法都能新建节点形成链表。

【1】尾插法

—1—>创建节点
—2—>生成链表:1)判断链表记录器有没有值——没有值: 2)定义游标indexNode
—3—>链表记录器没有值时:第一个节点的地址赋给head;
—4—>链表记录器有值时:head赋给indexNode,相当于让indexNode指向第一个节点,向后遍历链表;
—5—>判断indexNode.next是否为空:
不为空—>将indexNode.next赋给indexNode,实现indexNode游标指向下一个节点,
为空时—>使新节点newNode赋给indexNode.next,实现新节点插在链表尾部

【2】头插法

—1—>创建节点
—2—>生成链表:1)判断链表记录器有没有值——没有值: 2)定义游标indexNode
—3—>链表记录器没有值时:第一个节点的地址赋给head;
—4—>链表记录器有值时:使新节点newNode的next指向head(第一个节点),再让head指向newNode

【3】遍历输出链表

定义游标indexNode指向head,判断游标indexNode是否指向空,不指向空时,输出节点的value,再将indexNode.next赋给indexNode,实现游标向后移动
注意:为什么是indexNode != null,因为如果让indexNode.next != null时,意味着无法遍历到最后一个节点值。

【4】输出链表的长度

遍历时做一个计数器
在这里插入图片描述

【5】查找链表上是否有该元素

遍历时判断indexNode.value和需要查找的值value是否相等
在这里插入图片描述

【6】指定位置插入数据

index0:头插法;index最后:尾插法
index在中间:
—1—>定义indexNode游标遍历链表
—2—>定义position判断是否找到了位置:没找到就实现indexNode游标向下移动,同时position++;
在这里插入图片描述
—3—>定义新游标,指向indexNode的前一个
在这里插入图片描述
流程:要在2和3之间插入数据,
(1)首先indexNode游标指向第一个节点(head),pre指向indexNode前一个节点(空),position=0;
(2)判断position是否是插入的位置(index),不是就让pre指向indexNode现在指向的,indexNode向下遍历一个(实现pre永远指向indexNode前一个),再让position++;
(3)while循环判断position是否是插入的位置(index),再经过下面操作;
(4)当position==index,实现新节点插入

链表经典面试题

【1】返回单链表的后k个节点

在这里插入图片描述
单链表中游标不能向前走
双指针: fast,slow;fast先走k步,然后fast和slow同时走,fast走到最后时,slow后面的就是k个,slow到后面遍历输出
做题步骤:
1)画图分析
2)代码实现:逻辑实现(先按逻辑写伪代码);判断边界条件。
3)测试

【2】找到单链表的中间值

  • 双指针:fast走两步,slow走一步

在这里插入图片描述
(1)判断条件是fast.next!= null,在奇数正确,在偶数报错:
在偶数的时候,第一个fast.next指向空后,执行第二个fast = fast.next;语句会报错;

(2)判断条件是fast!= null,在偶数正确,在奇数报错
在奇数的时候,第一个fast.next指向空后,执行第二个fast = fast.next;语句会报错;
因此,判断条件要同时满足上面两个,才能保证正确

【3】判断链表是否成环

双指针:fast走两步,slow走一步
如果fast != null && fast.next != null不成立就返回false;
成立就执行slow = slow.next; fast = fast.next.next;
判断fast和slow是否

【4】判断成环的节点

在这里插入图片描述

【5】链表反转

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

一文进阶什么是负载均衡,通俗易懂的全文解析

文章目录1 写在前面2 引言3 概念4 分类4.1 根据载体类型分类4.3 根据地域范围分类4.4 根据 OSI 网络模型分类4.5 对比(四层和七层)5 算法与实现5.1 随机法(Random)5.2 轮询法(Round Robin)5.3 加权轮询法(Weighted Round Robin)5.4 加权随机法(Weighted Random)5.5 最快响应速度…

从JDK8到JDK18,Java垃圾回收的详细解答

经历了数千次改进,Java 的垃圾回收在吞吐量、延迟和内存大小方面有了巨大的进步。 2014 年3 月 JDK 8 发布,自那以来 JDK 又连续发布了许多版本,直到今日的 JDK 18 是 Java 的第十个版本。借此机会,我们来回顾一下 HotSpot JVM 的…

python隶属关系图模型:基于模型的网络中密集重叠社区检测方法

隶属关系图模型 是一种生成模型,可通过社区联系产生网络。下图描述了一个社区隶属关系图和网络的示例(图1)。最近我们被客户要求撰写关于社区检测的研究报告,包括一些图形和统计输出。 图1.左:社区关系图(圆…

ARM 汇编写启动代码之开 iCache

一、什么是 cache&#xff0c;有什么用 cache是一种内存&#xff0c;叫高速缓存。 从容量来说&#xff1a;CPU < 寄存器 < cache < DDR 从速度来说&#xff1a;CPU > 寄存器 > cache > DDRcache 的存在&#xff0c;是因为寄存器和 ddr 之间速度差异太大&a…

亚马逊云科技——云原生主题容器入门笔记

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 目录 一、容器入门课程 二、容器入门课堂笔记 1.容器背后的发展历史 2.区分容器与逻辑服务器的虚拟机 3.容…

号称 Java 圣经,Github 上爆火的 1058 页 JVM 全栈小册到底有什么魅力?

对于 JVM&#xff0c;我想大部分小伙伴都是要面试了才会去学&#xff0c;其余时间基本不会去看&#xff08;掐指一算&#xff0c;你们书架上面的深入理解 Java 虚拟机第三版应该都一层灰了吧【手动狗头】&#xff09;。但值得一说的是&#xff0c;当你工作多年之后&#xff0c;…

谷歌要完,百度也危了

文 | 天于刀刀当我们在抱怨搜索引擎的时候我们具体在说些什么&#xff1f;也许是饱受诟病的广告&#xff1f;或者是不合理的网页排序&#xff1f;又或是一种最直观的感觉——不好使。但是从来没有人抱怨过搜索引擎这一个模式。尽管这些年&#xff0c;也诞生一些诸如Magi这样让人…

Nginx配置实例-负载均衡

随着互联网信息的爆炸性增长&#xff0c;负载均衡&#xff08;load balance&#xff09;已经不再是一个很陌生的话题&#xff0c; 顾名思义&#xff0c;负载均衡即是将负载分摊到不同的服务单元&#xff0c;既保证服务的可用性&#xff0c;又保证响应 足够快&#xff0c;给用户…

Nginx安装搭建和环境准备教程(Ubantu)

本文以Ubantu18.08为例&#xff1a; 首先进入虚拟机中升级apt-get&#xff1a; apt-get update nginx进行安装&#xff1a; apt install nginx 使用命令查看nginx是否启动&#xff1a; systemctl status nginx nginx已经启动&#xff0c;可以到前端页面去访问是否真的已经启…

Vue项目中使用AntV G6绘制自适应图谱

Vue项目中使用AntV G6绘制自适应图谱 一、需求 需求1&#xff1a;Vue3.x项目下使用AntV G6绘制图谱 需求2&#xff1a;图谱节点为两个IP地址&#xff0c;节点间存在多条连线情况 需求3&#xff1a;鼠标悬浮到节点上方时&#xff0c;高亮当前节点并出现tooltip气泡提示&#…

Blackmagic黑魔法摄像机braw视频文件修复方法

Blackmagic是全球知名的影视级产品供应商&#xff0c;其高清摄像机是国内外各种剧组的最爱。Blackmagic的新产品目前使用braw格式&#xff0c;其编码采用自定义的raw编码&#xff0c;视频的效果和阿莱不相上下。近期我们处理了一例braw损坏无法播放的问题&#xff0c;我们来看看…

网络编程入门

什 么 是 网 络 编 程 网络编程的本质是多台计算机之间的数据交换。 数据传递本身没有多大的难度&#xff0c;不就是把一个设备中的数据发送给其他设备&#xff0c;然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的&#xff0c;也就是一个设备发…

[附源码]计算机毕业设计基于springboot的小区宠物管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

css样式引入方式及优缺点

这篇文章主要介绍了css样式引入及优缺点&#xff0c;本文给大家分享三种css的引入方式&#xff0c;通过代码给大家介绍的非常详细&#xff0c;对大家的学习或工作具有一定的参考借鉴价值&#xff0c;需要的朋友参考下吧 三种css的引入方式 1.行内样式 优点&#xff1a;书写方…

【Python自然语言处理】文本向量化处理用户对不同类型服装评论问题(超详细 附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 下面以文本向量化为目标&#xff0c;举例说明基于不同模型的实现过程&#xff0c;使用的数据集的主题是用户对不同类型的女性服装的评论&#xff0c;总共有23485条记录 实现步骤如下 一、导入库文件 首先导入需要的库文件…

MySQL数据库日志、备份与恢复

目录 前言 一.MySQL 日志管理 数据的重要性 造成数据丢失的原因 1、错误日志 2、通用查询日志 3、二进制日志 4、慢查询日志 5、查看日志 6.中继日志&#xff08;relay log&#xff09; 7、普通日志&#xff08;general log&#xff09; 配置文件 二、数据库备份的…

Metabase学习教程:系统管理-4

序列化&#xff1a;在Metabase实例间迁移 如何使用Metabase的序列化功能将问题、仪表板、集合、设置等从一个Metabase实例复制到新的Metabase实例。 Metabase序列化 序列化仅在商业版上可用&#xff08;仅在自托管计划上&#xff09;。 许多客户在迁移到本地部署的商业版时…

二叉树OJ题详解

第一题&#xff1a;单值二叉树 力扣链接&#xff1a;力扣 单值二叉树就是每一个节点存放的数据都相同&#xff0c;那么如何判断一棵树为单值二叉树呢&#xff1f;我们就拿最简单的一棵树为例子&#xff0c;比如根节点为1它的左子树和右子树也为1的一棵树&#xff0c;我们只需要…

以太网 TCP协议(TCP报文交互后的状态机变化)

2.7.2 以太网 TCP协议&#xff08;TCP报文交互后的状态机变化&#xff09; 一、TCP状态机&#xff1a; 二、TCP状态机变化 1、TCP三次握手 客户端主动发起SYN置位TCP之后&#xff0c;状态变为SYN_SENT(请求发送状态)服务器默认处于LISTEN(监听状态)。收到SYN报文之后&#x…

VMwareWorkStation如何添加万兆网卡,万兆网卡添加教程

1.引言 不同于ESXi&#xff0c;在VMware WorkStation&#xff08;后文简称VMware&#xff09;中添加网卡后没有选择网卡速度等级的选项&#xff0c;例如百兆、千兆、万兆等。就算点开右下角的”高级“也不管用。不过按照VMware的默认设定&#xff0c;当新建虚拟机选择32位操作系…