数据结构二——链表

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

底层存储

数组:一块连续的内存空间。
链表:用指针串起来的一组零散的内存空间。
在这里插入图片描述
链表分类:单链表、双向链表、循环链表

单链表

内存块是连接的节点。每个节点存储数据和指向下一个节点的指针。第一个节点叫做头结点,最后一个节点叫做尾节点。尾节点的next=null。
在这里插入图片描述

操作特点

1 插入、删除很快,O(1)。
2 想要随机访问只能从头节点开始遍历,数到第k个节点。平均时间复杂度O(n)。想象队列就是一个排队的队伍。每个人只知道自己后面的那个人。

循环链表

结构特点:循环列表的尾节点指向链表的头结点。
在这里插入图片描述
用途:用于解决数据具有环形结构的问题。例如约瑟夫问题。

双向链表

双向链表的节点存储:数据+指向下一个节点的指针+指向上一个节点的指针。
在这里插入图片描述

用途1:更方便的插入删除

删除的使用场景一般为:给定一个值,将具有这个值得节点删除。只是删除需要O(1)的时间,但是查询的平均时间复杂度为O(n)。根据时间复杂度的加法原则,时间复杂度为O(n)。
另外一个场景是:已经给定一个节点,删除这个节点。单项链表因为没有向前的指针,所以需要从头开始遍历,找到要删除节点的前一个节点。平均时间复杂度(O(n))。如果是双向列表,因为有向前的指针,O(1)就可以实现。

在某个节点前插入一个元素,双向列表显示出了优势,因为有前向指针。时间为O(1)。

用途2:在有序列表中查找更方便

因为每次查询时,都要比较当前元素和要找元素的大小,然后决定向前走,还是向后走。

链表 VS 数组

在时间复杂度方面:
数组:插入、删除 O(n) ;随机访问O(1)
链表:插入、删除O(1);随机访问 O(n)

数组的优点:数组更简单,可以利用CPU缓存,速度更快。
数组的缺点:需要申请固定大小的空间,在扩容的时候更加浪费内存,可能产生OOM。

链表的优点:大小可以是不固定的。
链表的缺点:内存块是不连续的,不能利用CPU缓存。

思考题:如何基于链表给出LRU缓存

LRU缓存:是指删除最近访问少的元素 的缓存策略。
已经访问过的元素用链表存储。现在假设访问元素a,有如下情况:
1 a在链表中,那把a元素删除,插入在队列头部作为头结点。
2 a不在链表中
2.1 并且链表空间充足,则把a插入在链表头部。
2.2 并且链表空间不足,则把尾元素删除,把a插入在链表头部。
因为要遍历每个元素,所以平均时间复杂度是O(n)。如果使用散列表就能提高速度。

写好链表代码的几个技巧

1 理解指针的含义。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。
2 警惕指针丢失和内存泄漏
3 利用哑结点简化代码
4 留意边界条件的处理。链表可以考虑的几个边界条件有:
4.1 如果列表为空,代码可以正常运行吗?
4.2 如果列表只包含一个节点,代码可以正常运行吗?
4.2 如果列表含2个节点,代码可以正常运行吗?
4.3 代码逻辑在处理头、尾节点的时候,代码可以正常运行吗?

5 举例画图帮助思考
6 多写多练

关于链表面试中经常遇到的场景

1 单链表翻转
2 是否有环检测
3 2个有序链表合并
4 删除倒数第k个节点
5 求中间节点

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

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

相关文章

[Bugku][Web][CTF] 30-33 write up

【说明】 整合资源 简略版本2020Bugku write up web30 关键字: txt or file_get_contents(fn)知识点:filegetcontents(fn) 知识点: file_get_contents(fn)知识点:fileg​etc​ontents(fn) 联想 php://input 步骤: 1.1…

UML作业第五次:分析系统,绘制状态图

一. PlantUML状态图 语法学习小结 1.简单状态 我们使用[*]开始和结束状态图,使用-->添加箭头。 startuml [*] --> Test1 Test1 --> [*] Test1 : this is a test Test1 : this is another testTest1 -> Test2 Test2 --> [*] enduml 2.更改状态渲染 我…

第四十一期:从Windows到鸿蒙——操作系统的前世与今生

世界上操作系统生意做得最好的是微软,但是世界上第一个做操作系统生意的不是微软,Windows也不是世界上最好用的系统。 作者:苏亚 “做一个操作系统的技术难度不大,难度大的是生态。”——任正非 华为被谷歌断供之后&#xff0c…

算法一——排序

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 分析排序算法的角度 算法的执行效率 算法的执行效率一般从时间复杂度以及比较、交换次数来考虑。 时间复杂度 时间复杂度需要考虑最好情况、最坏情况、平均情况时…

[Bugku][Crypto][CTF][2020]Crypto 1-20 write up

工具:CaptEncoder https://www.freebuf.com/sectool/188397.html Convert:https://pan.baidu.com/s/17YPXfvBHl_HyA00AffTBvg 密码:skqw 推荐网站:http://ctf.ssleye.com/ Crypto 1 关键字: 莫斯 /.- 步骤:莫斯解码得…

《我的十年图像生涯》—王郑耀(西安交通大学)

最近看王郑耀的《我的十年图像生涯》颇有感悟,在此把他的资料总结下 参考: 1.王郑耀《我的十年图像生涯》博客 链接——https://www.cnblogs.com/jsxyhelu/p/7054573.html 里边有自己这十年的经历; 2.王郑耀《数字图像的边缘检测》本科论文 链…

第四十二期:Linux转正日常办公电脑到底行不行

昨天是中国程序员们自定义的程序员日,阿里在秀食堂,另一网络巨头腾讯也不甘寂寞地小蹭了一下这个节日:发布了Linux QQ 2.0 beta,宣告Linux版QQ回归。 作者:电脑报 昨天是中国程序员们自定义的程序员日,阿…

算法二——二分查找

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 思考题目 1 用最省内存的方式查找数据。 2 快速定位ip所在省市 二分查找的速度 二分每次都通过跟区间中的中间元素对比,将待查找的区间缩小为一半&…

[Kali][VMware][2020][窗口大小][分辨率]高分辨率自适应

1.Vmware->查看->自动调整大小->自动适应窗口 2.Kali现在提供了HiDPI模式。此模式可调整GTK,QT甚至基于Java的界面的缩放比例,因此用户无需手动修改每个界面。您可以通过从应用程序菜单中打开“ Kali HiDPI模式”或kali-hidpi-mode从终端运行来…

第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧

拿到一个网络包时,我们总是希望它是尽可能小的。操作一个大包相当费时,有时甚至会死机。如果让初学者分析1GB以上的包,估计会被打击得信心全无。所以抓包时应该尽量只抓必要的部分。 作者:科技yuan 一、抓包 拿到一个网络包时&a…

Beta冲刺(9/7)——2019.5.31

作业描述 课程软件工程1916|W(福州大学)团队名称修!咻咻!作业要求项目Beta冲刺(团队)团队目标切实可行的计算机协会维修预约平台开发工具Eclipse团队信息 队员学号队员姓名个人博客地址备注221600207黄权焕https://www.cnblogs.co…

数据结构三——跳表

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 跳表的由来 说明:图片来自极客时间 由来   二分查找的数据结构是数组,利用数组随机访问的特定查找的时间复杂度是O(logn)。如果数据结构是…

[BUGKU][CTF][MISC][2020] MISC writeup持续更新中

CTF总结 ctf基本操作:https://blog.csdn.net/mafucan/article/details/106886421 zip: https://www.anquanke.com/post/id/86211 找软件推荐网址 1.https://www.52pojie.cn/ 2.没有的话百度一下 去找百度云 工具下载: stegSolve 隐写分析 需要配置Java…

spring学习(1):初始项目

1打开idea----new project 2点击建立项目的类型maven 点击next 3点击next 4选择路径&#xff0c;点击完成 5建立成功之后修改pom.xml配置文件 添加&#xff0c;解决依赖关系 <dependencies><dependency><groupId>org.springframework</groupId><ar…

while语句学习

while语句 while [break][continue] break 退出当前循环continue 退出当前循环&#xff0c;并重新循环。执行语句可以是单个语句或语句块。判断条件可以是任何表达式&#xff0c;任何非零、或非空&#xff08;null&#xff09;的值均为true。 当判断条件假false时&#xff0c;循…

[密码学][困难问题][常见规约]密码学问题常见困难问题

参考网址(科学上网) 密码学问题常见困难问题,需要点击参考网址进行查找 其困难问题的介绍非常友好&#xff0c;请根据目录快速找到相关资料 以下是检索 目录 Discrete logarithm problem DLP: discrete logarithm problem CDH: computational Diffie-Hellman problem SDH:…

数据结构四——散列表(下)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 7 散列表链表的应用 很多情况下散列表会和链表一起使用。散列表可以通过key查找value。链表可以按照value进行排序。这样就能通过value查找key&#xff0c;也可以通…

spring学习(2):初始化spring程序

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

Asp.Net Core 第05局:读取配置

前言 本文介绍Asp.Net Core 读取配置文件。环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 前期准备 1.添加app.json文件并在里面添加内容&#xff1b; 2.将app.json文件配置到应用中&#xff1b; 3.添加app.json对应的AppConfig类&#xff1b; 4.下面三种方式读取配置文…

[BUGKU][CTF][PWN][2020] PWN writeup

准备UBUNTU pwndbg pwntools PWN1 关键字&#xff1a;nc 知识点&#xff1a;nc使用方法 https://www.cnblogs.com/nmap/p/6148306.html nc命令是一个功能打包的网络实用程序&#xff0c;它通过命令行在网络上读取和写入数据;nc是为NMAP项目编写的&#xff0c;是目前已分裂的ne…