数据结构与算法 | 链表(Linked List)

链表(Linked List)

链表(Linked List)是一种线性数据结构,它由一系列节点(Node)组成,每个节点包含两部分:数据和指向下(上)一个节点的引用(或指针)。链表中的节点按照线性顺序连接在一起(相邻节点不需要存储在连续内存位置),不像数组一样存储在连续的内存位置。链表通常由头节点(Head)来表示整个链表,而尾节点的下一个节点指向null,表示链表的结束。

链表有几种常见的类型,其中最常见的包括单链表、双链表。

java 复制代码
 // Java LinkedList 中Node的结构
class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;

        }
}

基本概念

**链表基本结构是节点,节点一般包含数据和指向节点的指针;**节点只有指向下一个节点指针的叫单链表(Singly Linked List),有指向上一个节点的指针的叫双链表(Doubly Linked List)。

链表的一些关键特点:

  • 节点(Node): 链表的基本构建块是节点,每个节点包含两(三)部分,即 数据 element 和 指向下一个节点的指针 next (指向上一个节点的指针 prev)。
  • 单链表(Singly Linked List): 单链表中每个节点只有一个指针,即指向下一个节点的指针。
  • 双链表(Doubly Linked List): 双链表中每个节点有两个指针,一个指向下一个节点,另一个指向前一个节点,使得可以双向遍历链表。
  • 头节点(Head): 链表的头节点是链表的第一个节点,用于标识整个链表的起始位置。
  • 尾节点(Tail): 链表的尾节点是最后一个节点,其下一个节点引用通常指向null。

链表的性质:

  • 插入和删除元素的时间复杂度通常为O(1),因为只需要调整节点的指针。
  • 链表大小可以动态增长,不受固定内存大小的限制。
  • 访问元素的时间复杂度为O(n),因为必须从头节点开始遍历链表,直到找到目标元素。
  • 存储上占用较多内存空间,因为每个节点都需要存储数据和指针。

基本应用(Basic)

链表最基本的一些算法应用 是 根据要求操作节点指针 next 指针。

Leetcode 83. 删除排序链表中的重复元素【简单】

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

Leetcode 203. 移除链表元素【简单】

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

多节点(More Node)

在解决一些算法问题,同样可以定义多个指针指向多个链表节点(Node)来进行操作来完成解答。

Leetcode 19. 删除链表的倒数第 N 个结点【中等】

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

Leetcode 2. 两数相加【中等】

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

总结下

本篇主要介绍了链表基本结构,以及相关一些算法问题分析。链表还可以结合其他数据结构、算法思想比如 哈希(Hash)、优先队列(Priority Queue)等解决一些算法问题;考虑到本系列文章希望能够承前启后,不至于出现一些先前文章未介绍到的数据结构与算法,因此后续文章中再代入分析。

另外,从出题人的角度分析算法的问题也是一个不错的选择,可能会带来不一样的总结与经验。

欢迎点个小红心,关注公众号 Java研究者 联系、交流~

相关推荐
AI4Sci.8 分钟前
在云服务器上基于lora微调Qwen2.5-VL-7b-Instruct模型(下)
人工智能·算法·机器学习·大模型·lora微调·大模型本地部署·qwen2.5-vl-7b
一只小风华~10 分钟前
JavaScript:数组常用操作方法的总结表格
前端·javascript·数据结构·vue.js·算法
杨DaB17 分钟前
【SpringMVC】MVC中Controller的配置 、RestFul的使用、页面重定向和转发
java·笔记·后端·学习·spring·mvc·restful
linyb极客之路20 分钟前
干货来袭!5 分钟学会快速实现责任链,效率直接拉满!
java
创码小奇客24 分钟前
保姆级 Talos 超参数优化实战指南:从入门到封神
java·后端·架构
青云交32 分钟前
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与误报率降低策略(369)
java·大数据·入侵检测·智能安防·多源数据融合·误报率降低·视频语义理解
TiAmo zhang35 分钟前
深度学习与图像处理 | 基于PaddlePaddle的梯度下降算法实现(线性回归投资预测)
图像处理·深度学习·算法
我会冲击波44 分钟前
告别手写注释!变量命名、注释IDEA插件更新了,AI帮你搞定一切代码注释
java·intellij idea
一匹电信狗1 小时前
【C++】手搓一个STL风格的vector容器
c语言·数据结构·c++·算法·leetcode·stl·visual studio
生信探索1 小时前
SeuratExtend 可视化教程(1):单细胞分析的高颜值绘图指南
算法