数据结构与算法三(链表)

一、链表

1.什么是链表

  • 和数组一样,链表也是一种线性表
  • 从内存结构上看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构
  • 链表中的每一个内存块被称为节点Node,节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next

2.常见的缓存策略

  • 先进先出策略FIFO (First In,First Out)
  • 最少使用策略LFU (Least Frequently Used)
  • 最近最小使用策略LRU(Least Recently Used)

3.常见的三种链表结构

  • 单链表

    • 每个节点只包含一个指针,即后继指针
    • 单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,用尾节点的后继指针指向空指针地址null
    • 性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)
  • 双向链表
    • 节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)
    • 首节点的前驱指针prev和尾节点的后继指针均指向空地址
  • 循环链表
    • 除了尾节点的后继指针指向首节点的地址外,均与单链表一致
    • 试用于存储有循环特点的数据,比如约瑟夫问题

4.数组和链表的区别

  • 最直观的区别是数据需要一块连续的内存空间,对内存的要求比较高,如果我们申请一个100MB大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过指针将一组零散的内存块串联起来使用,所以如果我们申请的是100MB大小的链表,是不会有问题的。
  • 复杂度对比:
    时间复杂度 数组 链表
    插入删除 O(n) O(1)
    随机访问 O(1) O(n)
  • 链表相对于数组来说,内存空间消耗更大,因为需要额外的空间存储指针信息,对链表进行频繁的插入和删除操作,回导致频繁的内存申请和释放,容易造成内存碎片,在java中回造成频繁的GC操作

原文地址:https://www.cnblogs.com/jakaBlog/p/11284518.html

时间: 2024-10-06 02:25:50

数据结构与算法三(链表)的相关文章

数据结构与算法(三)--链表

一.链表 单项链表.循环链表.双向链表 链表和数组不同,链表的每个元素都存储了下一个元素的地址,所以链表不需要连续的存储空间: 如果我们申请一个 100MB 大小的数组,当内存中没有连续的.足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败. 1.单链表:内存块称为链表的"结点",把这个记录下个结点地址的指针叫作后继指针 next 头结点用来记录链表的基地址.有了它,我们就可以遍历得到整条链表.而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

数据结构与算法-单向链表

概述 由于最近在工作中需要用到树形结构来解决一些问题,所以萌生了系统学习“数据结构和算法”的想法,于是乎从最简单的表结构开始.由于数组是最简单的表结构的实现,也是各个编程语言内置的数据类型,所以不做更多的记录.表结构中以下实现打算学习: LinkedList Stack Queue HashTable Dictionary 本篇为学习数据结构的第一篇随笔,从最简单的单向链表开始吧. 实现(C#) 平台:dotNet Core 1.0, C# IDE:VSCode 如果考虑算法复用的话,可以实现泛

数据结构与算法(三)--单向链表

有的时候,处于内存中的数据并不是连续的.那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址.有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用. 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)单个节点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 (2)节点的删除非常方便,不需要像线性结构那样移动剩下的数据 (3)节点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的

数据结构与算法之链表

链表的分类: (1)单链表 头插法:只需要维护一个头结点即可,常用来模拟堆栈: 尾插法:需要维护头结点和尾结点,常用来模拟队列. (2)双向链表 双向遍历,可以用来保存网页的历史记录等: (3)循环链表 经常出现在面试题中,判断链表是否有环. 链表的删除 方式一:维护两个指针,current(表示当前节点)和previous(表示当前节点的前一个节点).当current遍历到要删除的元素时,执行previous->next = current->next,并删除current.在删除时,需要判

Java数据结构和算法(三)——简单排序

单单有数据还不够,对于数据的展现,经常要按照一定的顺序进行排列,越高要求的排序越复杂,这篇只介绍三种大小的简单排序. 1)冒泡排序 模拟:有数组,1,4,2,5,7,3. (1)首先从1开始冒泡,1比4小,不冒,4大于2,冒上去,与2交换位置,4比5小,不冒,7比3大,冒,结果:1,2,4,5,3,7 (2)接下来从2开始,因为第一个元素冒过了,重复(1),结果:1,2,4,3,5,7 (3)从第三位4开始,结果1,2,3,4,5,7 (4)虽然看起来已经排好序,但是还是要继续冒,接下来就是从第

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

研磨数据结构与算法-04链表

一,链表的节点 /* * 链结点,相当于是车厢 */ public class Node { //数据域 public long data; //指针域 public Node next; public Node(long value) { this.data = value; } /** * 显示方法 */ public void display() { System.out.print(data + " "); } } 二,简单链表 /* * 链表,相当于火车 */ public

数据结构和算法-008 链表

链表,要简单讲一讲. 链(Link)一般有两个部分,一是节点(node)和指针(point) Node:存放内容(content) Point:指向下一个节点,把节点穿起来,就形成链表 看代码, 这个的link其实是一个节点(Node),link穿起来就是一张链表(LinkedList) 实现一下功能 创建链表 在链表头部添加一个节点 删除头部节点 查找一个节点 删除指点节点 public class Link {          public String bookName;     pub