当前位置: 首页 > news >正文

【数据结构与算法】链表超全分类!从结构入门到双向链表初始化实现

在 Data Structures and Algorithms 中,**链表(Linked List)**是一种基础且非常重要的线性数据结构。与数组不同,链表通过节点之间的指针连接来组织数据,适合频繁插入和删除的场景。下面从结构入门 → 分类 → 双向链表实现系统讲解。


一、什么是链表(Linked List)

链表由节点(Node)组成,每个节点包含两部分:

数据(data) + 指针(next)

示意结构:

[ data | next ] → [ data | next ] → [ data | next ] → null

特点:

特点说明
非连续存储不像数组那样连续
插入删除快O(1)
查找慢O(n)

二、链表与数组的区别

特性数组链表
内存连续不连续
查找O(1)O(n)
插入O(n)O(1)
删除O(n)O(1)

适用场景:

  • 数组:频繁查询
  • 链表:频繁插入删除

三、链表的分类

链表根据结构可以分为:

链表 ├── 单向链表 ├── 双向链表 ├── 循环链表 └── 双向循环链表

四、单向链表(Singly Linked List)

结构:

head → node1 → node2 → node3 → null

节点结构:

classNode:def__init__(self,data):self.data=data self.next=None

优点:

  • 结构简单
  • 内存开销小

缺点:

  • 只能单向遍历

五、双向链表(Doubly Linked List)

双向链表每个节点包含:

prev ← node → next

结构示意:

null ← node1 ↔ node2 ↔ node3 → null

节点结构:

classNode:def__init__(self,data):self.data=data self.prev=Noneself.next=None

优点:

  • 可以双向遍历
  • 删除节点更方便

缺点:

  • 多一个指针
  • 占用更多内存

六、循环链表(Circular Linked List)

循环链表特点:

尾节点 → 指向头节点

结构:

head → node1 → node2 → node3 ↑ ↓ └───────────────←────────┘

应用:

  • 操作系统调度
  • 约瑟夫问题

七、双向链表初始化实现(Python)

下面实现一个完整双向链表结构

1 定义节点

classNode:def__init__(self,data):self.data=data self.prev=Noneself.next=None

2 定义链表类

classDoublyLinkedList:def__init__(self):self.head=None

3 头插法

definsert_head(self,data):new_node=Node(data)ifself.head:self.head.prev=new_node new_node.next=self.head self.head=new_node

示意:

new → head → node2 → node3

4 尾插法

definsert_tail(self,data):new_node=Node(data)ifnotself.head:self.head=new_nodereturntemp=self.headwhiletemp.next:temp=temp.nexttemp.next=new_node new_node.prev=temp

5 遍历链表

defdisplay(self):temp=self.headwhiletemp:print(temp.data,end=" <-> ")temp=temp.nextprint("None")

输出示例:

1 <-> 2 <-> 3 <-> None

八、完整示例

classNode:def__init__(self,data):self.data=data self.prev=Noneself.next=NoneclassDoublyLinkedList:def__init__(self):self.head=Nonedefinsert_head(self,data):new_node=Node(data)ifself.head:self.head.prev=new_node new_node.next=self.head self.head=new_nodedefinsert_tail(self,data):new_node=Node(data)ifnotself.head:self.head=new_nodereturntemp=self.headwhiletemp.next:temp=temp.nexttemp.next=new_node new_node.prev=tempdefdisplay(self):temp=self.headwhiletemp:print(temp.data,end=" <-> ")temp=temp.nextprint("None")

测试:

dll=DoublyLinkedList()dll.insert_head(2)dll.insert_head(1)dll.insert_tail(3)dll.display()

输出:

1 <-> 2 <-> 3 <-> None

九、链表时间复杂度

操作时间复杂度
访问O(n)
插入O(1)
删除O(1)
查找O(n)

十、链表经典算法题

链表是面试重点结构,常见题包括:

  1. 反转链表
  2. 合并两个有序链表
  3. 链表是否有环
  4. 找链表中间节点
  5. 删除倒数第 N 个节点

这些题在很多算法平台都会出现,例如:

  • LeetCode

总结

链表结构可以总结为:

链表 ├ 单向链表 ├ 双向链表 ├ 循环链表 └ 双向循环链表

核心特点:

  • 动态结构
  • 插入删除效率高
  • 访问效率低

双向链表则通过prev + next提供更灵活的操作。


如果你愿意,我可以继续给你整理一份链表算法最全总结(20道必会题 + Python实现),很多算法面试基本都会考到。

http://www.jsqmd.com/news/475947/

相关文章:

  • 单片机能做什么
  • GeoServer 2.24.x企业级定制开发实录:从源码编译到Jetty端口改造
  • 单片机/C语言八股:(十一)指针的补充,包括指针的类型和大小
  • OpenClaw+VibeCoding双引擎赋能:2025 IT复盘、2026开局与Agent时代深度洞察
  • 毕业设计实战:基于Spring Boot的教学管理系统设计与实现全攻略
  • 习题1.9 有序数组的插入
  • QT布局实战:如何避免控件大小被自动调整(附完整代码示例)
  • 横评后发现! 降AI率网站 千笔·降AI率助手 VS speedai 专科生首选
  • YOLOv12优化:AAAI2026 | 融合PartialNet Block的C3k2-YOLO高效目标检测网络 | 轻量化涨点设计
  • 深入解读OpenClaw配置文件:一个现代化AI网关的全景洞察
  • NER标注指南:BIO、BMES、BIOSE三种标签体系如何选择?优缺点对比
  • TestCraft的AI测试想法生成功能详解:如何用AI提升你的测试覆盖率
  • 基于 C# + Keil uvsock 的实时变量数组可视化工具
  • PTA 树与二叉树 1 二叉链树的创建与遍历
  • Funkey-D1s:基于全志D1s/T113-S3的RGB与MIPI双模嵌入式显示系统设计
  • 科研党必备:Mulimg Viewer 一键生成SCI论文对比图的保姆级教程
  • 赶deadline必备! 降AIGC软件 千笔·降AIGC助手 VS 知文AI,专科生专属神器!
  • 【文献阅读】PPLM——让语言模型真正“理解“蛋白质之间的对话
  • 【开源APPs】Github开源应用集锦
  • 导师严选!最强的降AI率软件 —— 千笔·降AI率助手
  • 目标:4月大厂暑假实习投递第二轮
  • 医生也能懂的ConDSeg指南:如何用AI精准分割息肉/腺体?
  • TA-Lib MACD实战避坑指南:Python金融分析中常见的5个参数设置错误
  • STM32F411 USB声卡实战:从噪音消除到中文名自定义全攻略
  • 手把手教你用Proteus 8 Professional搭建仿真电路:从原理图到仪表调试
  • 控制理论前置知识——卷积
  • 权重衰减参数的工作原理,以及对训练的影响
  • 阿里小云KWS模型与语音合成系统的无缝集成
  • 最小堆模拟
  • 2026别错过!AI论文写作软件 千笔·专业论文写作工具 VS 锐智 AI,专科生专属神器!