news 2026/10/10 14:25:23

数据结构(链表)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构(链表)

链表

链表是节点这种存储结构加上对节点的一套操作方法

目录

  • 节点
  • 操作方法
    • add方法
    • remove方法
    • insert方法
    • contains方法
    • 测试

节点

节点的结构包括存储的数据类型以及指向下一个节点的指针。

publicclassMyLinkedList{//节点属性:节点 指向下一个的指针publicclassNode{Objectvalue;Nodenext;publicNode(Objectvalue){this.value=value;this.next=null;}}

操作方法

//链表属性:头节点、尾节点和链表长度Nodehead;intsize;Nodelast;//操作方法:publicMyLinkedList(){this.head=null;this.size=0;this.last=null;}

这里的head和last并不是指头节点和尾节点,而是指向头节点和尾节点的指针,可以说它们像一个标签,贴在头节点和尾节点上面,负责帮计算机一下子定位到头尾的位置。

add方法

publicvoidadd(Objectvalue){NodenewNode=newNode(value);//如果链表为空if(head==null){head=newNode;//此时链表中只有一个节点,头尾都指向这个节点}else{//时间复杂度为n,当数据量大时,耗费时间长// Node temp=head;//从头节点往后找// while(temp.next!=null){// temp=temp.next;// }// temp.next=newNode;//时间复杂度为1last.next=newNode;//将原本的最后一个节点变成倒数第二个节点}last=newNode;//让尾部标签指向这个节点size++;}

remove方法

找到被删除元素的前驱节点,然后将前驱节点与被删除元素的后继节点连接

publicNodefindFirstNode(Objectkey){Nodetemp=head;while(temp.next!=null){if(temp.next.value==key){returntemp;//返回要删除元素的前驱节点}temp=temp.next;//继续移动遍历元素}returnnull;}//删除找到的第一个节点publicvoidremove(Objectkey){if(head==null){return;}//如果头节点就是if(head.value==key){head=head.next;size--;return;}Nodecur=findFirstNode(key);if(cur!=null){Nodedel=cur.next;cur.next=del.next;size--;}}

insert方法

链表必须通过遍历才能到达索引位置

//在任意位置插入节点publicvoidinsert(intindex,Objectvalue){if(head==null||isIndexOutBound(index)){return;}Nodecur=head;for(inti=0;i<index-1;i++){cur=cur.next;}//找到要插入位置的前驱节点cur//新节点先与后一节点连接,再把cur的后驱连接到新节点上NodenewNode=newNode(value);newNode.next=cur.next;cur.next=newNode;size++;}

contains方法

//查找元素:找到返回truepublicbooleancontains(Objectkey){if(head==null){returnfalse;}Nodetemp=head;while(temp!=null){if(temp.value==key){returntrue;}temp=temp.next;}returnfalse;}

如果在while循环里面将条件全部设为“temp.next”则会漏掉头节点——当链表中只有一个节点while的进入条件为假,直接退出程序返回false;当链表中有多个节点,if直接判断第二个节点是否是要找的元素。
如果只将进入while循环的条件设为"temp.next"则又会漏掉尾节点——当循环遍历到尾节点,进入条件判断为假,返回false.而在倒数第二个节点处,if判断的是当前元素,不是尾节点元素。

测试

staticvoidmain(){MyLinkedListl1=newMyLinkedList();l1.add(1);l1.add(2);l1.insert(1,9);System.out.println(l1.contains(9));System.out.println(l1.contains(1));System.out.println(l1.contains(2));l1.remove(1);System.out.println(l1.contains(1));}

运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 14:24:31

滑动窗口算法从原理到模板:固定窗口、可变窗口与单调队列优化

如果说算法题里有什么是“背过模板还得跪”的&#xff0c;滑动窗口绝对算一个。很多朋友刷题的时候都遇到过这种情况&#xff1a;明明把模板抄下来了&#xff0c;也知道left和right两个指针怎么挪&#xff0c;但题目稍微一变就晕——比如窗口什么时候收缩&#xff0c;收缩到什么…

作者头像 李华
网站建设 2026/10/10 14:24:00

Hadoop与Spark流批一体在金融信贷风控系统中的应用实践

简介&#xff1a;一套面向大数据开发与金融风控从业者的信贷风险控制系统源码&#xff0c;覆盖数据摄入、预处理、特征工程、模型训练与可视化展示等完整链路。系统基于Hadoop的分布式存储与MapReduce批处理&#xff0c;并借助Spark内存计算完成实时风险评分&#xff0c;同时结…

作者头像 李华
网站建设 2026/10/10 14:23:09

Prometheus监控MySQL实战:从exporter部署到告警与性能调优

简介&#xff1a;面向运维与云计算从业者的Prometheus&#xff08;普罗米修斯&#xff09;监控MySQL详细操作文档&#xff0c;系统讲解完整监控链路&#xff0c;涵盖mysql_exporter部署、静态配置与服务发现、Alertmanager报警等核心环节。资源为单份docx文档&#xff0c;共1个…

作者头像 李华
网站建设 2026/10/10 14:21:28

FastSVDD:基于RFF与KD-Tree的高效单类异常检测工程方案

简介&#xff1a;本资源是面向机器学习研究者与MATLAB开发者的高效异常检测工具包&#xff0c;聚焦单类分类与工业场景下的快速异常识别需求。FastSVDD在经典SVDD基础上优化了核心对象选取策略、核参数自适应机制及预处理流程&#xff0c;并充分利用MATLAB并行计算能力&#xf…

作者头像 李华