深入解析链表:解锁数据结构核心奥秘

一. 链表的定义

链表是一种线性数据结构,由一系列节点组成。每个节点包含两个部分:

  1. 数据域(Data):存储节点的数据。
  2. 指针域(Pointer):存储指向下一个节点的地址。

链表的第一个节点称为头节点(Head),最后一个节点的指针域指向空(NULL),表示链表的结束。

二. 链表的结构

1) 单向 / 双向

2) 带头 / 不带头

3)  循环 / 非循环

 链表种类丰富多样 重点掌握 单向不带头非循环 链表  可作为其他数据结构的子结构,如 哈希桶、图的邻接表等   笔试常考

  

三.  实现链表

 1) 节点类

定义链表节点类,每个节点包含数据和指向下一个节点的指针。

public class Node {int data;Node next;public Node(int data) {this.data = data;this.next = null;}
}

2) 链表类:

用于实现链表的功能 

public class MySingleList {private ListNode head;static class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}}public ListNode cur; // 临时头节点
}
 插入节点: 

                                                         插入节点  图示

// 在链表的末尾插入一个新节点void append(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;} else {Node current = head;while (current.next != null) {current = current.next;}current.next = newNode;}usedSize++;}// 在链表的开头插入一个新节点void prepend(int data) {Node newNode = new Node(data);newNode.next = head;head = newNode;usedSize++;}// 在指定位置插入一个新节点void insertAt(int index, int data) {if (index < 0 || index > usedSize) {throw new IndexOutOfBoundsException("Index out of bounds");}Node newNode = new Node(data);if (index == 0) {newNode.next = head;head = newNode;} else {Node current = head;for (int i = 0; i < index - 1; i++) {current = current.next;}newNode.next = current.next;current.next = newNode;}usedSize++;}
 删除节点: 
// 删除指定位置的节点void deleteAt(int index) {if (index < 0 || index >= usedSize) {throw new IndexOutOfBoundsException("Index out of bounds");}if (index == 0) {head = head.next;} else {Node current = head;for (int i = 0; i < index - 1; i++) {current = current.next;}current.next = current.next.next;}usedSize--;}
 查找节点:
// 查询指定位置的节点Node getNodeAt(int index) {if (index < 0 || index >= usedSize) {throw new IndexOutOfBoundsException("Index out of bounds");}Node current = head;for (int i = 0; i < index; i++) {current = current.next;}return current;}

 四. 链表OJ 实战 ! 

 1)  开胃小菜  删除所有值域为val的节点

力扣链接: . - 力扣(LeetCode)

class Solution {public ListNode removeElements(ListNode head, int val) {while(head!= null && head.val == val){head = head.next;}ListNode cur = head;while(cur != null && cur.next != null){if(cur.next.val == val){cur.next = cur.next.next;}else{cur = cur.next;}}return head;} 
}

2)  反转链表 重要程度 五颗星 !!!

力扣链接: . - 力扣(LeetCode)

//    反转链表public ListNode reverseList(ListNode head) {// 定义两个指针,pre初始化为null,用于存储反转后的链表ListNode pre = null;// cur初始化为head,表示当前处理的节点ListNode cur = head;// 循环直到cur为null,表示已经处理完所有节点while(cur != null){// temp临时存储cur的下一个节点,因为接下来要修改cur.nextListNode temp = cur.next;// 将cur的next指针指向pre,实现反转cur.next = pre;// pre和cur都前进一步pre = cur; // pre移动到cur的位置cur = temp; // cur移动到下一个待处理的节点}// 当cur为null时,pre就是新链表的头节点return pre;}

 思路: 在遍历链表时逐步反转每个节点的指针方向 

3) 快慢指针算法 

快慢指针: 处理环形链表或数组非常有用

其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。

力扣链接: 876. 链表的中间结点 - 力扣(LeetCode)

public ListNode middleNode(ListNode head) {// 定义快慢指针,都初始化为头节点headListNode fast = head;ListNode slow = head;// 循环条件,快指针fast及其next不为nullwhile (fast != null && fast.next != null) {// 快指针fast每次向前移动两步fast = fast.next.next;// 慢指针slow每次向前移动一步slow = slow.next;}// 当快指针到达链表末尾时,慢指针正好到达中间节点return slow;}

 原理 : 因为fast的速度是 slow的速度的二倍, 而fast走完,slow 必然在中间位置.

 4) 合并两个有序链表:

思路 : 使用 虚拟节点 为了简化头节点的处理逻辑

比较大小 插入新链表

如果其中一个链表的节点全部被插入到新链表中,如果另一个链表还有剩余节点, 直 接将这些剩余节点链接到新链表的末尾。
记得最后返回虚拟节点的下一个节点.

力扣链接: . - 力扣(LeetCode)

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummy = new ListNode(-1);//虚拟节点// 创建一个指针cur,用来遍历并构建新的合并后的链表,初始指向哑节点ListNode cur = dummy;// 遍历链表直到其中一个为空while(list1 != null && list2 != null){if(list1.val > list2.val){cur.next = list2;list2 = list2.next;}else{cur.next = list1;list1 = list1.next;}cur = cur.next;}// 如果其中一个链表先遍历完,将另一个链表的剩余部分连接到新链表的末尾cur.next = (list1 == null) ? list2:list1;return dummy.next; //返回虚拟节点的下一个节点}

 五. ArrayList和LinkedList的区别

  • 数组: 适用于需要快速访问和固定大小的情况。
  • 链表: 适用于频繁插入和删除、且大小动态变化的情况。

 六. 总结 

链表作为数据结构中的佼佼者,凸显了其在动态数据操作场景下的独特价值,特别是对于需要频繁执行插入和删除操作的应用来说,更是不可或缺。掌握链表的基础操作,包括但不限于节点的创建、插入、删除及遍历,以及进阶技巧如链表的反转、合并操作,以及利用快慢指针解决复杂链表问题,是深化链表理解和应用实践的关键步骤。在链表与数组的权衡选择上,认识到两者各自的强项——数组的快速随机访问与链表的高效动态修改能力,是根据具体需求制定数据结构策略的先决条件。总而言之,链表的灵活高效使其在众多计算领域内占有一席之地,而深入探索其特性和应用,则是对每一位技术探索者的智慧挑战与能力提升之旅。

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

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

相关文章

【Linux】Wmware Esxi磁盘扩容

目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中&#xff0c;每一个硬件设备都映射到一个系统的文件&#xff0c;对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…

Linux 中的文本编辑

文章目录 Linux 中的文本编辑Vi 和 Vim 的基本介绍三种工作模式常用快捷键 Linux 中的文本编辑 在 Linux 系统中&#xff0c;内置了强大的文本编辑器 Vi 和其增强版本 Vim。 Vi 和 Vim 的基本介绍 Vim 作为 Vi 的增强版&#xff0c;具有出色的程序编辑能力&#xff0c;能以字…

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

【详细教程】如何使用YOLOv10进行图片与视频的目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

datax入门(data-web的简单使用)——02

datax入门&#xff08;data-web的简单使用&#xff09;——02 1. 前言1.1 关于data-web官网1.1.1 源码下载1.1.2 datax-Web部署手册1.1.2.1 Linux环境部署手册1.1.2.2 本地开发环境部署手册 1.2 关于datax入门 2. 下载之后打包、启动、登录2.1 我的本地环境2.2 修改配置2.3 初始…

SQL数据库学习指南:从基础到高级

SQL数据库学习指南&#xff1a;从基础到高级 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL数据库的学习指南&#xff0c;从基础到高级&…

html纯原生网页引入vue3版本的quill editor

效果图 版本 vueup/vue-quill v1.2.0vue3.3.8Element Plus v2.4.2 引入流程 找一个vue3的项目, 然后安装插件vue版本的quill: vue-quill npm install vueup/vue-quill --save官方地址&#xff1a;https://vueup.github.io/vue-quill/ 安装完成之后&#xff0c;把vue-quil插件下…

如何搭建数据安全架构?包含数据安全资产梳理、敏感数据发现、数据风险检测、安全态势感知等解决方案

如何搭建数据安全架构&#xff1f;包含数据安全资产梳理、敏感数据发现、数据风险检测、安全态势感知等解决方案。 搭建数据安全架构是一个复杂且系统化的过程&#xff0c;涉及多个方面和层次。以下是一个详细的方案&#xff0c;涵盖数据安全资产梳理、敏感数据发现、数据风险检…

详解HTTP:HTTP的一次请求

HTTP请求的发起 当用户通过浏览器或其他客户端发起一个HTTP请求来获取网页时&#xff0c;这个请求首先会在应用层构建。HTTP是一个基于TCP的应用层协议&#xff0c;它定义了客户端和服务器之间的通信格式和规则。 TCP封装 接下来&#xff0c;HTTP请求会被交给传输层的TCP协议进…

解开孤独症谱系障碍:原因与症状的深度洞察

孤独症谱系障碍&#xff0c;这个日益受到关注的话题&#xff0c;让许多人感到困惑和担忧。那么&#xff0c;它究竟是由什么原因引起的&#xff0c;又有哪些表现症状呢&#xff1f; 引起孤独症谱系障碍的原因目前尚未完全明确&#xff0c;但研究表明&#xff0c;可能与以下因素有…

深度解析:Transformer模型如何革新序列数据处理

标题&#xff1a;深度解析&#xff1a;Transformer模型如何革新序列数据处理 摘要 自2017年Google的论文《Attention Is All You Need》发布以来&#xff0c;Transformer模型以其独特的注意力机制&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域引起了革命性的变…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …

量产工具一一显示系统(一)

目录 前言 一、项目介绍和应用 1.简单易用 2.软件可配置、易扩展 3.纯 C 语言编程 4.类似界面应用 二、项目总体框架 三、显示系统 1.显示系统数据结构抽象 &#xff08;1&#xff09;common.h &#xff08;2&#xff09;disp_manager.h 2.Framebuffer编程 &#x…

Java中的switch语句详解

Java中的switch语句详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来详细探讨一下Java中的switch语句。switch语句是Java中的一种多分支选择结构&…

Unity数据持久化3——Json

概述 基础知识 Json文件格式 Json基本语法 练习 可以搜索&#xff1a;Json在线&#xff0c;复制代码进去解析是否写错了。 Excel转Json C#读取存储Json文件 JsonUtility using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine;[Sy…

AI周报(6.23-6.29)

AI应用-巴西医生成功用Vision Pro做手术 巴西外科医生布鲁诺戈巴托&#xff08;Bruno Gobbato&#xff09;在2024年4月22日首次成功使用Apple Vision Pro进行了肩袖撕裂的手术。这次手术采用了肩关节镜技术&#xff0c;通过关节内的摄像头捕捉图像&#xff0c;并通过高分辨率的…

基于Spring Boot的校园失物招领系统

1 项目介绍 1.1 研究的背景及意义 在网络时代飞速发展的今天&#xff0c;随着网络技术日臻完善&#xff0c;我们的生活方式正经历深刻变革。在物质追求日益增长的同时&#xff0c;提升个人精神境界也成为了现代人的共同向往&#xff0c;而阅读则是滋养心灵、丰富精神世界的重…

信息检索(57):MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS

MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS 摘要1 引言2 相关工作3 预期 FLOPS 次数4 我们的方法5 实验6 结论 发布时间&#xff08;2020&#xff09; 最小化 Flop 来学习高效的稀疏表示 摘要 1&#xff09;学习高维稀疏表示 2&#xff09;FLOP 集成到损失…

PyScript:在浏览器中释放Python的强大

PyScript&#xff1a;Python代码&#xff0c;直接在网页上运行。- 精选真开源&#xff0c;释放新价值。 概览 PyScript是一个创新的框架&#xff0c;它打破了传统编程环境的界限&#xff0c;允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…