首页 > 其他分享 >说说你对链表的理解?常见的操作有哪些?

说说你对链表的理解?常见的操作有哪些?

时间:2024-04-15 18:46:12浏览次数:27  
标签:current 结点 哪些 常见 next 链表 插入 节点

一、是什么

链表(Linked List)是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,由一系列结点(链表中每一个元素称为结点)组成

每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

 节点用代码表示,则如下:

class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}
  • data 表示节点存放的数据
  • next 表示下一个节点指向的内存空间

相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)O(1)

链表的结构也十分多,常见的有四种形式:

  • 单链表:除了头节点和尾节点,其他节点只包含一个后继指针
  • 循环链表:跟单链表唯一的区别就在于它的尾结点又指回了链表的头结点,首尾相连,形成了一个环
  • 双向链表:每个结点具有两个方向指针,后继指针(next)指向后面的结点,前驱指针(prev)指向前面的结点,其中节点的前驱指针和尾结点的后继指针均指向空地址NULL
  • 双向循环链表:跟双向链表基本一致,不过头节点前驱指针指向尾迹诶单和尾节点的后继指针指向头节点

二、操作

关于链表的操作可以主要分成如下:

  • 遍历
  • 插入
  • 删除

遍历

遍历很好理解,就是根据next指针遍历下去,直到为null,如下:

let current = head
while(current){
 console.log(current.val)
  current = current.next
}

插入

向链表中间插入一个元素,可以如下图所示:

可以看到,插入节点可以分成如下步骤:

  • 存储插入位置的前一个节点

  • 存储插入位置的后一个节点

  • 将插入位置的前一个节点的 next 指向插入节点

  • 将插入节点的 next 指向前面存储的 next 节点

相关代码如下所示:

let current = head
while (current < position){
  pervious = current;
  current = current.next;
}
pervious.next = node;
node.next = current;

如果在头节点进行插入操作的时候,会实现previousNode节点为undefined,不适合上述方式

解放方式可以是在头节点前面添加一个虚拟头节点,保证插入行为一致

删除

向链表任意位置删除节点,如下图操作:

从上图可以看到删除节点的步骤为如下:

  • 获取删除节点的前一个节点
  • 获取删除节点的后一个节点
  • 将前一个节点的 next 指向后一个节点
  • 向删除节点的 next 指向为null

如果想要删除制定的节点,示意代码如下:

while (current != node){
  pervious = current;
  current = current.next;
  nextNode = current.next;
}
pervious.next = nextNode

同样如何希望删除节点处理行为一致,可以在头节点前面添加一个虚拟头节点

三、应用场景

缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等

当缓存空间被用满时,我们可能会使用LRU最近最好使用策略去清楚,而实现LRU算法的数据结构是链表,思路如下:

维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头部开始顺序遍历链表

  • 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据的对应结点,并将其从原来的位置删除,并插入到链表头部
  • 如果此数据没在缓存链表中
    • 如果此时缓存未满,可直接在链表头部插入新节点存储此数据
    • 如果此时缓存已满,则删除链表尾部节点,再在链表头部插入新节点

由于链表插入删除效率极高,达到O(1)。对于不需要搜索但变动频繁且无法预知数量上限的数据的情况的时候,都可以使用链表

参考文献

  • https://zh.wikipedia.org/zh-hans/%E9%93%BE%E8%A1%A8
  • https://mah93.github.io/2019/07/19/js-linked/

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

 

标签:current,结点,哪些,常见,next,链表,插入,节点
From: https://www.cnblogs.com/smileZAZ/p/18136686

相关文章

  • codegen的使用方法及常见参数配置
    前言在进行API开发时,我们通常需要定义API的接口规范和文档,以方便其他开发者调用和使用。Swagger是一款非常流行的API文档生成工具,它可以帮助我们快速生成API接口文档,并提供了许多便捷的功能。本文将介绍如何使用swagger-codegen来生成API接口文档。简介swagger-codegen是Swagge......
  • 【知识点】常见的SQL优化手段
    问:有哪些常见的SQL优化手段?这也是个高频面试题,并且并非面试造火箭的那种问题,实际项目中也会有非常多的地方需要进行SQL优化避免使用Select*select*中,无用字段会增加网络带宽消耗,特别是varchar、blob、text等大字段select*无法使用Mysql优化器覆盖索引的优化。覆盖索......
  • 知识库系统的功能有哪些,可以为IT管理员解决什么问题?
    在日常工作当中,IT管理员面临着日益繁杂和快速发展的技术挑战。针对这些挑战,知识库系统被广泛应用于企业和组织中,旨在提供一个集中化、结构化的知识管理平台,为IT管理员提供便捷的知识获取和分享渠道。那么,知识库系统的功能有哪些?它又可以为IT管理员解决哪些问题呢?  知识库系统......
  • App内测分发是什么意思?内测方式有哪些?
    App内测分发是软件开发流程中的一个重要环节,主要目的是在正式发布前,将尚未公开的应用程序版本分发给特定的测试用户,以获取反馈并发现和修复潜在的问题。内测分发有助于确保应用的质量和用户体验,并减少在正式发布后可能遇到的bug或性能问题。具体来说,App内测分发的方式可以细分为......
  • 医疗诊断中图像识别技术还有哪些潜在的应用价值呢
    医疗诊断中,图像识别技术的潜在应用价值远不止于目前已经实现的领域。除了之前提到的医学影像分析、手术辅助和药物研发等方面的应用,图像识别技术在医疗诊断中还有以下潜在的应用价值:病理学研究:在病理学领域,图像识别技术可以自动化处理和分析数字化的病理学图像。通过对细胞、组......
  • 合并k个已排序链表
    利用新的ArrayList合并k个链表 遍历提供给我们的数组,依次得到各个头结点。依次遍历每个头结点下的链表,把他们加入新的数组中。利用Collections.sort()方法得到有序的数组最后把这个新的数组转换成链表并返回。publicListNodemergeKLists(ArrayList<ListNode>lists){......
  • 特氟龙(PFA)实验室器具有哪些?
    PFA是被称为塑料王,具有出众的化学耐受性,并且可在出色的温度范围内执行工作。PFA呈半透明,柔韧,并且由于其高密度重量有点重。PFA具有惰性和低粘合性,溶出物和痕量金属含量较低。它具有较宽的含氟聚合物温度范围,从-200℃到+260℃,在整个范围内具有出色的化学耐受性。PFA还具有......
  • 随机链表的复制
     随机链表的复制 /*//DefinitionforaNode.classNode{intval;Nodenext;Noderandom;publicNode(intval){this.val=val;this.next=null;this.random=null;}}*/classSolution{publicNode......
  • 链表中环的入口结点
       1.先用快慢指针判断是否存在环2.返回快慢指针相遇的地方,一个指针停留在那里。3.另一个指针回到头节点4.两个节点一起走,每次走一格,再次相遇的地方就是入口节点publicclassSolution{    //判断有没有环,返回相遇的地方    publicListNodehasCycle(ListN......
  • centos7 安装supervisor教程以及常见问题
    目录简介Supervisor是一个进程控制系统。它是一个C/S系统(注意:其提供WEB接口给用户查询和控制)。它允许用户去监控和控制在类UNIX系统的进程。它的目标与launchd、daemontools和runit有些相似。但是与它们不一样的是、它不是作为init(进程号pid是1)运行。它是......