数据结构—链表

news/2024/5/19 6:23:13/文章来源:https://blog.csdn.net/weixin_53233197/article/details/128172559

文章目录

  • 链表(头插法、尾插法、单链表反转)
    • 二分查找算法:
    • 哈夫曼编码
  • 构建链表
    • 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.luyixian.cn/news_show_230668.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12家硬件厂商发布飞桨生态发行版 软硬一体协同发展

11月30日,由深度学习技术及应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会如期举行。峰会上,百度AI技术生态总经理马艳军发布了飞桨深度学习平台的最新技术和生态进展,全新发布飞桨开源框架2.4版本,…

【论文简述】 Point-MVSNet:Point-Based Multi-View Stereo Network(ICCV 2019)

一、论文简述 1. 第一作者:Rui Chen、Songfang Han 2. 发表年份:2019 3. 发表期刊:ICCV 4. 关键词:MVS、深度学习、点云、迭代改进 5. 探索动机:很多传统方法通过多视图光度一致性和正则化优化迭代更新&#xff…

【Java实战】大厂都是怎样进行单元测试的

目录 一、前言 二、单元测试 1.【强制】好的单元测试必须遵守 AIR 原则。 2.【强制】单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。不…

清华、北大、中科大、UMA、MSU五位博士生畅聊深度学习理论

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!伴随着深度学习的蓬勃发展,进入人们视线的好像都是算法或AlphaGo等应用层面的东西。但是在理论上,深度学习似乎却没有很出圈的相关理论。因此,部分人也在批评深度学习是缺乏理论…

蓝海创意云·11月大事记 || 12月,暖心相伴

秋尽冬生,日短天寒 告别了立冬与小雪 时光不紧不慢开启了新一月的篇章 万物冬藏,沉淀酝酿 站在十二月的路口 蛰伏打磨,静待厚积而薄发 导 读 ● 客户端更新:新增PSD通道合成选项 ● 渲染案例:绝代双骄重启江湖…

Reading Note(10)——AutoBridge

这篇论文是FPGA 2021年的best paper award,主要解决的是在HLS编译过程中优化布局和布线,最终达到整个multi-die的FPGA板上的大规模HLS设计时钟频率尽可能提升的目的,这篇工作在当前chiplet工艺铺展开来的当下更加有现实意义,通过这…

浅谈ES标准的演变

ECMAScript从1997年第一版诞生依赖,经过无数人的“踩坑”和“填坑”,到现在,ES12呼之欲出。那么我们不妨讨论一下ES的发展历程,看它如何统一江湖,看它“曲折”而又令人期待的发展之路。 最近分析typescript&#xff0c…

jsp网络申报审批系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 网络申报审批系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用…

16S全长测序揭示绿头虻肠道微生物及共生细菌

论文题目:Greenhead (Tabanus nigrovittatus) Wolbachia and Its Microbiome: A Preliminary Study 期刊:Microbiol Spectrum 研究背景 绿头虻(Tabanus nigrovittatus)的雌虫刺吸牲畜的血液,危害家畜,是美…

【从零开始学习深度学习】6.使用torchvision下载与查看图像分类数据集Fashion-MNIST

目录1.1 获取Fashion-MNIST数据集2.2 读取小批量小结图像分类数据集中最常用的是手写数字识别数据集MNIST。但大部分模型在MNIST上的分类精度都超过了95%。为了更直观地观察算法之间的差异,我们将使用一个图像内容更加复杂的数据集Fashion-MNIST。 本节我们将使用to…

分享几款免费实用的国产内网穿透工具

对于没有公网IP的用户来说,如何实现远程管理或让局域网的服务可以被公网访问到是一个问题。当然,也有很多类似的需求,比如: 微信公众号小程序开发调试公网访问本地web项目异地远程处理公司服务问题异地访问公司内网财务/管理系统…

什么是代码签名证书?

使用代码签名证书,您可以保证签名者的身份和软件的完整性,这可以防止在下载和安装软件时出现警告。 代码签名证书是软件开发人员用来签署其软件、应用程序和驱动程序代码的数字证书。它使用公私密钥基础设施(PKI)将实体绑定到公钥和私钥。 申请代码签名…

好用的数据恢复软件EasyRecovery2023最新版

实用的数据恢复软件有什么?电脑中的数据文件对很多的小伙伴来说都是非常重要的,在下载安装新的软件设备时都需要非常谨慎,一旦碰到一些病毒就可能会导致文件丢失,想要恢复这些文件并不是很容易,需要使用专业的数据恢复…

西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录

百年党建与马克思主义中国化研究 党的纪律建设的实践、启示与创新——基于“三大纪律八项注意”的研究 武艳; 5-8 西部研究《西部学刊》投稿:cn7kantougao163.com 新疆红色资源运用现状调查研究——以南疆部分地区为例 王艺潼;努尔古扎丽阿不都克里木; 9-12…

毕业设计-基于机器视觉的深蹲检测识别-TensorFlow-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Flink

文章目录1. 概述1.1 Apache Flink1.2 特点1.3 Flink VS Spark Streaming2. 安装与部署2. Flink运行时的组件2.1 作业管理器(JobManager)2.2 任务管理器(TaskManager)2.3 资源管理器(ResourceManager)2.4 分发器(Dispatcher)3. 任务提交流程4. Flink API4.1 不用级别…

红石外汇|每日汇评:在中国重新开放和OPEC+的推动下,欧元受到高度关注

1、本周开始欧元再次上涨,而美元则暴跌; 2、积极的美国就业数据和OPEC稳定的产量提升为经济回升提供前景; 3、市场对中国重新开放的渴望可能很快就会实现; 今天,由于美元再次面临压力,欧元兑美元在亚盘市…

window和linux的nacos安装

Nacos注册中心 Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高 Nacos的下载 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: …

代码随想录刷题Day55 | 392. 判断子序列 | 115. 不同的子序列

代码随想录刷题Day55 | 392. 判断子序列 | 115. 不同的子序列 392. 判断子序列 题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形…

闲人闲谈PS之三十六——项目状态控制

**惯例闲话:**最近感觉时间不够用,脑子有很多想法,但是到下笔却感觉总是下不了手,写完一段,感觉和自己想的差距很大,然后有全部删除…这难道就是传说中年纪大了,手脚不停使唤…这让闲人更加焦虑…