C语言数据结构系列:链表篇
- C语言数据结构系列(二):单链表------完全指南
-
- 一、前言
- 二、链表的基本概念
-
- [2.1 什么是链表?](#2.1 什么是链表?)
- [2.2 数组 vs 链表](#2.2 数组 vs 链表)
- [2.3 节点的结构](#2.3 节点的结构)
- 三、链表的基本操作
-
- [3.1 创建节点](#3.1 创建节点)
- [3.2 头插法插入](#3.2 头插法插入)
- [3.3 尾插法插入](#3.3 尾插法插入)
- [3.4 指定位置插入](#3.4 指定位置插入)
- [3.5 删除节点](#3.5 删除节点)
- [3.6 查找节点](#3.6 查找节点)
- [3.7 打印链表](#3.7 打印链表)
- [3.8 释放链表](#3.8 释放链表)
- 四、完整示例代码
- 五、经典链表问题
-
- [5.1 反转链表](#5.1 反转链表)
- [5.2 求链表长度](#5.2 求链表长度)
- [5.3 找中间节点](#5.3 找中间节点)
- [5.4 判断是否有环](#5.4 判断是否有环)
- 六、复杂度总结
- 七、链表的应用场景
- [八、练习题 🎯](#八、练习题 🎯)
-
- [🏠 基础题](#🏠 基础题)
- [💪 进阶题](#💪 进阶题)
- 九、总结
- 十、下篇预告
C语言数据结构系列(二):单链表------完全指南
🎯 本篇目标:深入理解链表的概念,掌握单链表的增删改查,学会链表的各种经典操作!
一、前言
哈喽小伙伴们!👋
上一篇我们学习了数组,它虽然随机访问很快,但有个致命缺点------大小固定!想要增删元素还需要移动大量数据,太麻烦了!😫
今天我们要学习的链表 ,就像一列火车🚆,每节车厢(节点)可以随时挂载或脱钩,完美解决了数组的痛点!
#mermaid-svg-x1dv2Fc6eGTuPwQm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-x1dv2Fc6eGTuPwQm .error-icon{fill:#552222;}#mermaid-svg-x1dv2Fc6eGTuPwQm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-x1dv2Fc6eGTuPwQm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .marker.cross{stroke:#333333;}#mermaid-svg-x1dv2Fc6eGTuPwQm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-x1dv2Fc6eGTuPwQm p{margin:0;}#mermaid-svg-x1dv2Fc6eGTuPwQm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster-label text{fill:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster-label span{color:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster-label span p{background-color:transparent;}#mermaid-svg-x1dv2Fc6eGTuPwQm .label text,#mermaid-svg-x1dv2Fc6eGTuPwQm span{fill:#333;color:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .node rect,#mermaid-svg-x1dv2Fc6eGTuPwQm .node circle,#mermaid-svg-x1dv2Fc6eGTuPwQm .node ellipse,#mermaid-svg-x1dv2Fc6eGTuPwQm .node polygon,#mermaid-svg-x1dv2Fc6eGTuPwQm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .rough-node .label text,#mermaid-svg-x1dv2Fc6eGTuPwQm .node .label text,#mermaid-svg-x1dv2Fc6eGTuPwQm .image-shape .label,#mermaid-svg-x1dv2Fc6eGTuPwQm .icon-shape .label{text-anchor:middle;}#mermaid-svg-x1dv2Fc6eGTuPwQm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .rough-node .label,#mermaid-svg-x1dv2Fc6eGTuPwQm .node .label,#mermaid-svg-x1dv2Fc6eGTuPwQm .image-shape .label,#mermaid-svg-x1dv2Fc6eGTuPwQm .icon-shape .label{text-align:center;}#mermaid-svg-x1dv2Fc6eGTuPwQm .node.clickable{cursor:pointer;}#mermaid-svg-x1dv2Fc6eGTuPwQm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .arrowheadPath{fill:#333333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x1dv2Fc6eGTuPwQm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-x1dv2Fc6eGTuPwQm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x1dv2Fc6eGTuPwQm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster text{fill:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm .cluster span{color:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-x1dv2Fc6eGTuPwQm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-x1dv2Fc6eGTuPwQm rect.text{fill:none;stroke-width:0;}#mermaid-svg-x1dv2Fc6eGTuPwQm .icon-shape,#mermaid-svg-x1dv2Fc6eGTuPwQm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x1dv2Fc6eGTuPwQm .icon-shape p,#mermaid-svg-x1dv2Fc6eGTuPwQm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-x1dv2Fc6eGTuPwQm .icon-shape .label rect,#mermaid-svg-x1dv2Fc6eGTuPwQm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x1dv2Fc6eGTuPwQm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-x1dv2Fc6eGTuPwQm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-x1dv2Fc6eGTuPwQm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🚂 车头
数据:10
🚃 车厢
数据:20
🚃 车厢
数据:30
🚃 车厢
数据:40
📭 尾部
NULL
让我们开始今天的学习吧! 🚀
二、链表的基本概念
2.1 什么是链表?
链表(Linked List) 是一种非连续 存储的线性数据结构,由若干节点 组成,每个节点包含数据域 和指针域。
简单来说:
- 🚂 每个节点就像一节火车车厢
- 🔗 指针就是连接车厢的挂钩
- 📍 不需要连续的内存,可以分散在各处
2.2 数组 vs 链表
| 特性 | 数组 | 链表 |
|---|---|---|
| 存储方式 | 连续 | 非连续 |
| 大小 | 固定 | 动态 |
| 访问方式 | 随机访问 O(1) | 顺序访问 O(n) |
| 插入/删除 | 慢 O(n) | 快 O(1) |
| 内存利用 | 可能浪费 | 按需分配 |
2.3 节点的结构
每个节点包含两部分:
#mermaid-svg-sbjhDhfk7oBAjWGE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sbjhDhfk7oBAjWGE .error-icon{fill:#552222;}#mermaid-svg-sbjhDhfk7oBAjWGE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sbjhDhfk7oBAjWGE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sbjhDhfk7oBAjWGE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sbjhDhfk7oBAjWGE .marker.cross{stroke:#333333;}#mermaid-svg-sbjhDhfk7oBAjWGE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sbjhDhfk7oBAjWGE p{margin:0;}#mermaid-svg-sbjhDhfk7oBAjWGE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster-label text{fill:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster-label span{color:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster-label span p{background-color:transparent;}#mermaid-svg-sbjhDhfk7oBAjWGE .label text,#mermaid-svg-sbjhDhfk7oBAjWGE span{fill:#333;color:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE .node rect,#mermaid-svg-sbjhDhfk7oBAjWGE .node circle,#mermaid-svg-sbjhDhfk7oBAjWGE .node ellipse,#mermaid-svg-sbjhDhfk7oBAjWGE .node polygon,#mermaid-svg-sbjhDhfk7oBAjWGE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sbjhDhfk7oBAjWGE .rough-node .label text,#mermaid-svg-sbjhDhfk7oBAjWGE .node .label text,#mermaid-svg-sbjhDhfk7oBAjWGE .image-shape .label,#mermaid-svg-sbjhDhfk7oBAjWGE .icon-shape .label{text-anchor:middle;}#mermaid-svg-sbjhDhfk7oBAjWGE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sbjhDhfk7oBAjWGE .rough-node .label,#mermaid-svg-sbjhDhfk7oBAjWGE .node .label,#mermaid-svg-sbjhDhfk7oBAjWGE .image-shape .label,#mermaid-svg-sbjhDhfk7oBAjWGE .icon-shape .label{text-align:center;}#mermaid-svg-sbjhDhfk7oBAjWGE .node.clickable{cursor:pointer;}#mermaid-svg-sbjhDhfk7oBAjWGE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sbjhDhfk7oBAjWGE .arrowheadPath{fill:#333333;}#mermaid-svg-sbjhDhfk7oBAjWGE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sbjhDhfk7oBAjWGE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sbjhDhfk7oBAjWGE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sbjhDhfk7oBAjWGE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sbjhDhfk7oBAjWGE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sbjhDhfk7oBAjWGE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster text{fill:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE .cluster span{color:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sbjhDhfk7oBAjWGE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sbjhDhfk7oBAjWGE rect.text{fill:none;stroke-width:0;}#mermaid-svg-sbjhDhfk7oBAjWGE .icon-shape,#mermaid-svg-sbjhDhfk7oBAjWGE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sbjhDhfk7oBAjWGE .icon-shape p,#mermaid-svg-sbjhDhfk7oBAjWGE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sbjhDhfk7oBAjWGE .icon-shape .label rect,#mermaid-svg-sbjhDhfk7oBAjWGE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sbjhDhfk7oBAjWGE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sbjhDhfk7oBAjWGE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sbjhDhfk7oBAjWGE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 节点Node
数据域
data
指针域
next
C语言结构体定义:
c
// 链表节点的结构体
typedef struct Node {
int data; // 数据域:存放数据
struct Node *next; // 指针域:指向下一个节点
} Node;
💡 小贴士 :为什么是
struct Node *next而不是Node *next?因为在结构体内部,类型名还没定义完成,必须用
struct Node!
三、链表的基本操作
3.1 创建节点
c
// 创建一个新节点
Node* createNode(int value) {
Node *newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败!\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
3.2 头插法插入
💡 头插法:新节点总是插入到链表头部,就像在火车头前面加一节新车厢!
#mermaid-svg-bGwsJmt1VMSrVK0Q{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bGwsJmt1VMSrVK0Q .error-icon{fill:#552222;}#mermaid-svg-bGwsJmt1VMSrVK0Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bGwsJmt1VMSrVK0Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .marker.cross{stroke:#333333;}#mermaid-svg-bGwsJmt1VMSrVK0Q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bGwsJmt1VMSrVK0Q p{margin:0;}#mermaid-svg-bGwsJmt1VMSrVK0Q .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster-label text{fill:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster-label span{color:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster-label span p{background-color:transparent;}#mermaid-svg-bGwsJmt1VMSrVK0Q .label text,#mermaid-svg-bGwsJmt1VMSrVK0Q span{fill:#333;color:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .node rect,#mermaid-svg-bGwsJmt1VMSrVK0Q .node circle,#mermaid-svg-bGwsJmt1VMSrVK0Q .node ellipse,#mermaid-svg-bGwsJmt1VMSrVK0Q .node polygon,#mermaid-svg-bGwsJmt1VMSrVK0Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .rough-node .label text,#mermaid-svg-bGwsJmt1VMSrVK0Q .node .label text,#mermaid-svg-bGwsJmt1VMSrVK0Q .image-shape .label,#mermaid-svg-bGwsJmt1VMSrVK0Q .icon-shape .label{text-anchor:middle;}#mermaid-svg-bGwsJmt1VMSrVK0Q .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .rough-node .label,#mermaid-svg-bGwsJmt1VMSrVK0Q .node .label,#mermaid-svg-bGwsJmt1VMSrVK0Q .image-shape .label,#mermaid-svg-bGwsJmt1VMSrVK0Q .icon-shape .label{text-align:center;}#mermaid-svg-bGwsJmt1VMSrVK0Q .node.clickable{cursor:pointer;}#mermaid-svg-bGwsJmt1VMSrVK0Q .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .arrowheadPath{fill:#333333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bGwsJmt1VMSrVK0Q .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bGwsJmt1VMSrVK0Q .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bGwsJmt1VMSrVK0Q .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster text{fill:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q .cluster span{color:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bGwsJmt1VMSrVK0Q .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bGwsJmt1VMSrVK0Q rect.text{fill:none;stroke-width:0;}#mermaid-svg-bGwsJmt1VMSrVK0Q .icon-shape,#mermaid-svg-bGwsJmt1VMSrVK0Q .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bGwsJmt1VMSrVK0Q .icon-shape p,#mermaid-svg-bGwsJmt1VMSrVK0Q .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bGwsJmt1VMSrVK0Q .icon-shape .label rect,#mermaid-svg-bGwsJmt1VMSrVK0Q .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bGwsJmt1VMSrVK0Q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bGwsJmt1VMSrVK0Q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bGwsJmt1VMSrVK0Q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 插入
新节点
数据:5
原头节点
数据:10
节点
数据:20
NULL
代码实现:
c
// 头插法:在链表头部插入新节点
void insertAtHead(Node **head, int value) {
Node *newNode = createNode(value);
newNode->next = *head; // 新节点指向原头节点
*head = newNode; // 更新头指针
}
3.3 尾插法插入
💡 尾插法:新节点插入到链表尾部,就像在火车尾部挂一节新车厢!
#mermaid-svg-lSOh7eY88UqovaeC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lSOh7eY88UqovaeC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lSOh7eY88UqovaeC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lSOh7eY88UqovaeC .error-icon{fill:#552222;}#mermaid-svg-lSOh7eY88UqovaeC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lSOh7eY88UqovaeC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lSOh7eY88UqovaeC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lSOh7eY88UqovaeC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lSOh7eY88UqovaeC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lSOh7eY88UqovaeC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lSOh7eY88UqovaeC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lSOh7eY88UqovaeC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lSOh7eY88UqovaeC .marker.cross{stroke:#333333;}#mermaid-svg-lSOh7eY88UqovaeC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lSOh7eY88UqovaeC p{margin:0;}#mermaid-svg-lSOh7eY88UqovaeC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lSOh7eY88UqovaeC .cluster-label text{fill:#333;}#mermaid-svg-lSOh7eY88UqovaeC .cluster-label span{color:#333;}#mermaid-svg-lSOh7eY88UqovaeC .cluster-label span p{background-color:transparent;}#mermaid-svg-lSOh7eY88UqovaeC .label text,#mermaid-svg-lSOh7eY88UqovaeC span{fill:#333;color:#333;}#mermaid-svg-lSOh7eY88UqovaeC .node rect,#mermaid-svg-lSOh7eY88UqovaeC .node circle,#mermaid-svg-lSOh7eY88UqovaeC .node ellipse,#mermaid-svg-lSOh7eY88UqovaeC .node polygon,#mermaid-svg-lSOh7eY88UqovaeC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lSOh7eY88UqovaeC .rough-node .label text,#mermaid-svg-lSOh7eY88UqovaeC .node .label text,#mermaid-svg-lSOh7eY88UqovaeC .image-shape .label,#mermaid-svg-lSOh7eY88UqovaeC .icon-shape .label{text-anchor:middle;}#mermaid-svg-lSOh7eY88UqovaeC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lSOh7eY88UqovaeC .rough-node .label,#mermaid-svg-lSOh7eY88UqovaeC .node .label,#mermaid-svg-lSOh7eY88UqovaeC .image-shape .label,#mermaid-svg-lSOh7eY88UqovaeC .icon-shape .label{text-align:center;}#mermaid-svg-lSOh7eY88UqovaeC .node.clickable{cursor:pointer;}#mermaid-svg-lSOh7eY88UqovaeC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lSOh7eY88UqovaeC .arrowheadPath{fill:#333333;}#mermaid-svg-lSOh7eY88UqovaeC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lSOh7eY88UqovaeC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lSOh7eY88UqovaeC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lSOh7eY88UqovaeC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lSOh7eY88UqovaeC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lSOh7eY88UqovaeC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lSOh7eY88UqovaeC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lSOh7eY88UqovaeC .cluster text{fill:#333;}#mermaid-svg-lSOh7eY88UqovaeC .cluster span{color:#333;}#mermaid-svg-lSOh7eY88UqovaeC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lSOh7eY88UqovaeC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lSOh7eY88UqovaeC rect.text{fill:none;stroke-width:0;}#mermaid-svg-lSOh7eY88UqovaeC .icon-shape,#mermaid-svg-lSOh7eY88UqovaeC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lSOh7eY88UqovaeC .icon-shape p,#mermaid-svg-lSOh7eY88UqovaeC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lSOh7eY88UqovaeC .icon-shape .label rect,#mermaid-svg-lSOh7eY88UqovaeC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lSOh7eY88UqovaeC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lSOh7eY88UqovaeC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lSOh7eY88UqovaeC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 插入
头节点
数据:10
节点
数据:20
原尾节点
数据:30
新节点
数据:40
NULL
代码实现:
c
// 尾插法:在链表尾部插入新节点
void insertAtTail(Node **head, int value) {
Node *newNode = createNode(value);
// 如果链表为空,新节点就是头节点
if (*head == NULL) {
*head = newNode;
return;
}
// 找到最后一个节点
Node *current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode; // 尾节点指向新节点
}
3.4 指定位置插入
在第 pos 个位置插入新节点:
#mermaid-svg-viEii1DAJzvP1bvM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-viEii1DAJzvP1bvM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-viEii1DAJzvP1bvM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-viEii1DAJzvP1bvM .error-icon{fill:#552222;}#mermaid-svg-viEii1DAJzvP1bvM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-viEii1DAJzvP1bvM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-viEii1DAJzvP1bvM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-viEii1DAJzvP1bvM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-viEii1DAJzvP1bvM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-viEii1DAJzvP1bvM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-viEii1DAJzvP1bvM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-viEii1DAJzvP1bvM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-viEii1DAJzvP1bvM .marker.cross{stroke:#333333;}#mermaid-svg-viEii1DAJzvP1bvM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-viEii1DAJzvP1bvM p{margin:0;}#mermaid-svg-viEii1DAJzvP1bvM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-viEii1DAJzvP1bvM .cluster-label text{fill:#333;}#mermaid-svg-viEii1DAJzvP1bvM .cluster-label span{color:#333;}#mermaid-svg-viEii1DAJzvP1bvM .cluster-label span p{background-color:transparent;}#mermaid-svg-viEii1DAJzvP1bvM .label text,#mermaid-svg-viEii1DAJzvP1bvM span{fill:#333;color:#333;}#mermaid-svg-viEii1DAJzvP1bvM .node rect,#mermaid-svg-viEii1DAJzvP1bvM .node circle,#mermaid-svg-viEii1DAJzvP1bvM .node ellipse,#mermaid-svg-viEii1DAJzvP1bvM .node polygon,#mermaid-svg-viEii1DAJzvP1bvM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-viEii1DAJzvP1bvM .rough-node .label text,#mermaid-svg-viEii1DAJzvP1bvM .node .label text,#mermaid-svg-viEii1DAJzvP1bvM .image-shape .label,#mermaid-svg-viEii1DAJzvP1bvM .icon-shape .label{text-anchor:middle;}#mermaid-svg-viEii1DAJzvP1bvM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-viEii1DAJzvP1bvM .rough-node .label,#mermaid-svg-viEii1DAJzvP1bvM .node .label,#mermaid-svg-viEii1DAJzvP1bvM .image-shape .label,#mermaid-svg-viEii1DAJzvP1bvM .icon-shape .label{text-align:center;}#mermaid-svg-viEii1DAJzvP1bvM .node.clickable{cursor:pointer;}#mermaid-svg-viEii1DAJzvP1bvM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-viEii1DAJzvP1bvM .arrowheadPath{fill:#333333;}#mermaid-svg-viEii1DAJzvP1bvM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-viEii1DAJzvP1bvM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-viEii1DAJzvP1bvM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-viEii1DAJzvP1bvM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-viEii1DAJzvP1bvM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-viEii1DAJzvP1bvM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-viEii1DAJzvP1bvM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-viEii1DAJzvP1bvM .cluster text{fill:#333;}#mermaid-svg-viEii1DAJzvP1bvM .cluster span{color:#333;}#mermaid-svg-viEii1DAJzvP1bvM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-viEii1DAJzvP1bvM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-viEii1DAJzvP1bvM rect.text{fill:none;stroke-width:0;}#mermaid-svg-viEii1DAJzvP1bvM .icon-shape,#mermaid-svg-viEii1DAJzvP1bvM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-viEii1DAJzvP1bvM .icon-shape p,#mermaid-svg-viEii1DAJzvP1bvM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-viEii1DAJzvP1bvM .icon-shape .label rect,#mermaid-svg-viEii1DAJzvP1bvM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-viEii1DAJzvP1bvM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-viEii1DAJzvP1bvM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-viEii1DAJzvP1bvM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 插入新节点
节点1
节点2
新节点
节点3
代码实现:
c
// 在指定位置插入
void insertAtPos(Node **head, int pos, int value) {
if (pos < 0) {
printf("位置无效!\n");
return;
}
// 如果在头部插入
if (pos == 0) {
insertAtHead(head, value);
return;
}
// 找到插入位置的前一个节点
Node *current = *head;
for (int i = 0; i < pos - 1 && current != NULL; i++) {
current = current->next;
}
// 位置超出链表长度
if (current == NULL) {
printf("位置超出链表长度!\n");
return;
}
Node *newNode = createNode(value);
newNode->next = current->next;
current->next = newNode;
}
3.5 删除节点
删除指定值的节点:
#mermaid-svg-A6PJeUtO3LgwVDUk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-A6PJeUtO3LgwVDUk .error-icon{fill:#552222;}#mermaid-svg-A6PJeUtO3LgwVDUk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-A6PJeUtO3LgwVDUk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-A6PJeUtO3LgwVDUk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-A6PJeUtO3LgwVDUk .marker.cross{stroke:#333333;}#mermaid-svg-A6PJeUtO3LgwVDUk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-A6PJeUtO3LgwVDUk p{margin:0;}#mermaid-svg-A6PJeUtO3LgwVDUk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster-label text{fill:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster-label span{color:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster-label span p{background-color:transparent;}#mermaid-svg-A6PJeUtO3LgwVDUk .label text,#mermaid-svg-A6PJeUtO3LgwVDUk span{fill:#333;color:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk .node rect,#mermaid-svg-A6PJeUtO3LgwVDUk .node circle,#mermaid-svg-A6PJeUtO3LgwVDUk .node ellipse,#mermaid-svg-A6PJeUtO3LgwVDUk .node polygon,#mermaid-svg-A6PJeUtO3LgwVDUk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-A6PJeUtO3LgwVDUk .rough-node .label text,#mermaid-svg-A6PJeUtO3LgwVDUk .node .label text,#mermaid-svg-A6PJeUtO3LgwVDUk .image-shape .label,#mermaid-svg-A6PJeUtO3LgwVDUk .icon-shape .label{text-anchor:middle;}#mermaid-svg-A6PJeUtO3LgwVDUk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-A6PJeUtO3LgwVDUk .rough-node .label,#mermaid-svg-A6PJeUtO3LgwVDUk .node .label,#mermaid-svg-A6PJeUtO3LgwVDUk .image-shape .label,#mermaid-svg-A6PJeUtO3LgwVDUk .icon-shape .label{text-align:center;}#mermaid-svg-A6PJeUtO3LgwVDUk .node.clickable{cursor:pointer;}#mermaid-svg-A6PJeUtO3LgwVDUk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-A6PJeUtO3LgwVDUk .arrowheadPath{fill:#333333;}#mermaid-svg-A6PJeUtO3LgwVDUk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-A6PJeUtO3LgwVDUk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-A6PJeUtO3LgwVDUk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A6PJeUtO3LgwVDUk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-A6PJeUtO3LgwVDUk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A6PJeUtO3LgwVDUk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster text{fill:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk .cluster span{color:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-A6PJeUtO3LgwVDUk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-A6PJeUtO3LgwVDUk rect.text{fill:none;stroke-width:0;}#mermaid-svg-A6PJeUtO3LgwVDUk .icon-shape,#mermaid-svg-A6PJeUtO3LgwVDUk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A6PJeUtO3LgwVDUk .icon-shape p,#mermaid-svg-A6PJeUtO3LgwVDUk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-A6PJeUtO3LgwVDUk .icon-shape .label rect,#mermaid-svg-A6PJeUtO3LgwVDUk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A6PJeUtO3LgwVDUk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-A6PJeUtO3LgwVDUk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-A6PJeUtO3LgwVDUk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 删除
节点1
节点2
节点4
代码实现:
c
// 删除指定值的节点
void deleteNode(Node **head, int value) {
// 链表为空
if (*head == NULL) {
printf("链表为空!\n");
return;
}
// 如果要删除的是头节点
if ((*head)->data == value) {
Node *temp = *head;
*head = (*head)->next;
free(temp);
return;
}
// 查找要删除节点的前一个节点
Node *current = *head;
while (current->next != NULL && current->next->data != value) {
current = current->next;
}
// 没找到
if (current->next == NULL) {
printf("未找到值为%d的节点!\n", value);
return;
}
// 删除节点
Node *temp = current->next;
current->next = temp->next;
free(temp);
}
3.6 查找节点
c
// 查找节点,返回节点指针
Node* search(Node *head, int value) {
Node *current = head;
while (current != NULL) {
if (current->data == value)
return current;
current = current->next;
}
return NULL; // 未找到
}
3.7 打印链表
c
// 打印链表
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d", current->data);
if (current->next != NULL)
printf(" -> ");
current = current->next;
}
printf(" -> NULL\n");
}
3.8 释放链表
c
// 释放整个链表
void freeList(Node **head) {
Node *current = *head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
*head = NULL;
}
四、完整示例代码
c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建节点
Node* createNode(int value) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 头插法
void insertAtHead(Node **head, int value) {
Node *newNode = createNode(value);
newNode->next = *head;
*head = newNode;
}
// 尾插法
void insertAtTail(Node **head, int value) {
Node *newNode = createNode(value);
if (*head == NULL) {
*head = newNode;
return;
}
Node *current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
// 指定位置插入
void insertAtPos(Node **head, int pos, int value) {
if (pos == 0) {
insertAtHead(head, value);
return;
}
Node *current = *head;
for (int i = 0; i < pos - 1 && current != NULL; i++) {
current = current->next;
}
if (current == NULL) {
printf("位置无效!\n");
return;
}
Node *newNode = createNode(value);
newNode->next = current->next;
current->next = newNode;
}
// 删除节点
void deleteNode(Node **head, int value) {
if (*head == NULL) return;
if ((*head)->data == value) {
Node *temp = *head;
*head = (*head)->next;
free(temp);
return;
}
Node *current = *head;
while (current->next != NULL && current->next->data != value) {
current = current->next;
}
if (current->next != NULL) {
Node *temp = current->next;
current->next = temp->next;
free(temp);
}
}
// 查找
Node* search(Node *head, int value) {
Node *current = head;
while (current != NULL) {
if (current->data == value)
return current;
current = current->next;
}
return NULL;
}
// 打印链表
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d", current->data);
if (current->next) printf(" -> ");
current = current->next;
}
printf(" -> NULL\n");
}
// 释放链表
void freeList(Node **head) {
Node *current = *head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
*head = NULL;
}
int main() {
Node *head = NULL;
printf("===== 单链表操作演示 =====\n\n");
// 尾插法插入
printf("尾插法插入 10, 20, 30, 40:\n");
insertAtTail(&head, 10);
insertAtTail(&head, 20);
insertAtTail(&head, 30);
insertAtTail(&head, 40);
printList(head);
// 头插法插入
printf("\n头插法插入 5:\n");
insertAtHead(&head, 5);
printList(head);
// 指定位置插入
printf("\n在位置2插入 25:\n");
insertAtPos(&head, 2, 25);
printList(head);
// 查找
printf("\n查找元素 25:\n");
Node *found = search(head, 25);
if (found)
printf("找到了!值为: %d\n", found->data);
else
printf("未找到!\n");
// 删除
printf("\n删除元素 30:\n");
deleteNode(&head, 30);
printList(head);
// 释放
freeList(&head);
return 0;
}
运行结果:
===== 单链表操作演示 =====
尾插法插入 10, 20, 30, 40:
10 -> 20 -> 30 -> 40 -> NULL
头插法插入 5:
5 -> 10 -> 20 -> 30 -> 40 -> NULL
在位置2插入 25:
5 -> 10 -> 25 -> 20 -> 30 -> 40 -> NULL
查找元素 25:
找到了!值为: 25
删除元素 30:
5 -> 10 -> 25 -> 20 -> 40 -> NULL
五、经典链表问题
5.1 反转链表
💡 思路:使用三个指针,逐个改变节点指向
#mermaid-svg-fMrt1feTmfyLq4U3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fMrt1feTmfyLq4U3 .error-icon{fill:#552222;}#mermaid-svg-fMrt1feTmfyLq4U3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fMrt1feTmfyLq4U3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fMrt1feTmfyLq4U3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fMrt1feTmfyLq4U3 .marker.cross{stroke:#333333;}#mermaid-svg-fMrt1feTmfyLq4U3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fMrt1feTmfyLq4U3 p{margin:0;}#mermaid-svg-fMrt1feTmfyLq4U3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster-label text{fill:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster-label span{color:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster-label span p{background-color:transparent;}#mermaid-svg-fMrt1feTmfyLq4U3 .label text,#mermaid-svg-fMrt1feTmfyLq4U3 span{fill:#333;color:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 .node rect,#mermaid-svg-fMrt1feTmfyLq4U3 .node circle,#mermaid-svg-fMrt1feTmfyLq4U3 .node ellipse,#mermaid-svg-fMrt1feTmfyLq4U3 .node polygon,#mermaid-svg-fMrt1feTmfyLq4U3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fMrt1feTmfyLq4U3 .rough-node .label text,#mermaid-svg-fMrt1feTmfyLq4U3 .node .label text,#mermaid-svg-fMrt1feTmfyLq4U3 .image-shape .label,#mermaid-svg-fMrt1feTmfyLq4U3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-fMrt1feTmfyLq4U3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fMrt1feTmfyLq4U3 .rough-node .label,#mermaid-svg-fMrt1feTmfyLq4U3 .node .label,#mermaid-svg-fMrt1feTmfyLq4U3 .image-shape .label,#mermaid-svg-fMrt1feTmfyLq4U3 .icon-shape .label{text-align:center;}#mermaid-svg-fMrt1feTmfyLq4U3 .node.clickable{cursor:pointer;}#mermaid-svg-fMrt1feTmfyLq4U3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fMrt1feTmfyLq4U3 .arrowheadPath{fill:#333333;}#mermaid-svg-fMrt1feTmfyLq4U3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fMrt1feTmfyLq4U3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fMrt1feTmfyLq4U3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fMrt1feTmfyLq4U3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fMrt1feTmfyLq4U3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fMrt1feTmfyLq4U3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster text{fill:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 .cluster span{color:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fMrt1feTmfyLq4U3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fMrt1feTmfyLq4U3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-fMrt1feTmfyLq4U3 .icon-shape,#mermaid-svg-fMrt1feTmfyLq4U3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fMrt1feTmfyLq4U3 .icon-shape p,#mermaid-svg-fMrt1feTmfyLq4U3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fMrt1feTmfyLq4U3 .icon-shape .label rect,#mermaid-svg-fMrt1feTmfyLq4U3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fMrt1feTmfyLq4U3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fMrt1feTmfyLq4U3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fMrt1feTmfyLq4U3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 反转后
NULL
3
2
1
原链表
1
2
3
NULL
代码实现:
c
// 反转链表
Node* reverseList(Node *head) {
Node *prev = NULL; // 前一个节点
Node *current = head; // 当前节点
Node *next = NULL; // 下一个节点
while (current != NULL) {
next = current->next; // 保存下一个节点
current->next = prev; // 反转指向
prev = current; // prev前移
current = next; // current前移
}
return prev; // prev就是新的头节点
}
图解过程:
#mermaid-svg-KD2nd1XjVFxcxQeU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KD2nd1XjVFxcxQeU .error-icon{fill:#552222;}#mermaid-svg-KD2nd1XjVFxcxQeU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KD2nd1XjVFxcxQeU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KD2nd1XjVFxcxQeU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KD2nd1XjVFxcxQeU .marker.cross{stroke:#333333;}#mermaid-svg-KD2nd1XjVFxcxQeU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KD2nd1XjVFxcxQeU p{margin:0;}#mermaid-svg-KD2nd1XjVFxcxQeU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster-label text{fill:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster-label span{color:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster-label span p{background-color:transparent;}#mermaid-svg-KD2nd1XjVFxcxQeU .label text,#mermaid-svg-KD2nd1XjVFxcxQeU span{fill:#333;color:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU .node rect,#mermaid-svg-KD2nd1XjVFxcxQeU .node circle,#mermaid-svg-KD2nd1XjVFxcxQeU .node ellipse,#mermaid-svg-KD2nd1XjVFxcxQeU .node polygon,#mermaid-svg-KD2nd1XjVFxcxQeU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KD2nd1XjVFxcxQeU .rough-node .label text,#mermaid-svg-KD2nd1XjVFxcxQeU .node .label text,#mermaid-svg-KD2nd1XjVFxcxQeU .image-shape .label,#mermaid-svg-KD2nd1XjVFxcxQeU .icon-shape .label{text-anchor:middle;}#mermaid-svg-KD2nd1XjVFxcxQeU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KD2nd1XjVFxcxQeU .rough-node .label,#mermaid-svg-KD2nd1XjVFxcxQeU .node .label,#mermaid-svg-KD2nd1XjVFxcxQeU .image-shape .label,#mermaid-svg-KD2nd1XjVFxcxQeU .icon-shape .label{text-align:center;}#mermaid-svg-KD2nd1XjVFxcxQeU .node.clickable{cursor:pointer;}#mermaid-svg-KD2nd1XjVFxcxQeU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KD2nd1XjVFxcxQeU .arrowheadPath{fill:#333333;}#mermaid-svg-KD2nd1XjVFxcxQeU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KD2nd1XjVFxcxQeU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KD2nd1XjVFxcxQeU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KD2nd1XjVFxcxQeU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KD2nd1XjVFxcxQeU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KD2nd1XjVFxcxQeU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster text{fill:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU .cluster span{color:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KD2nd1XjVFxcxQeU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KD2nd1XjVFxcxQeU rect.text{fill:none;stroke-width:0;}#mermaid-svg-KD2nd1XjVFxcxQeU .icon-shape,#mermaid-svg-KD2nd1XjVFxcxQeU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KD2nd1XjVFxcxQeU .icon-shape p,#mermaid-svg-KD2nd1XjVFxcxQeU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KD2nd1XjVFxcxQeU .icon-shape .label rect,#mermaid-svg-KD2nd1XjVFxcxQeU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KD2nd1XjVFxcxQeU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KD2nd1XjVFxcxQeU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KD2nd1XjVFxcxQeU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 步骤1: prev=NULL, current=1
步骤2: prev=1, current=2
步骤3: prev=2, current=3
步骤4: prev=3, current=NULL
5.2 求链表长度
c
int getLength(Node *head) {
int count = 0;
Node *current = head;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
5.3 找中间节点
💡 思路:快慢指针,快指针走两步,慢指针走一步
c
Node* findMiddle(Node *head) {
Node *slow = head;
Node *fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
5.4 判断是否有环
c
bool hasCycle(Node *head) {
Node *slow = head;
Node *fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
return true;
}
return false;
}
六、复杂度总结
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
| 头插法 | O(1) | 直接插入 |
| 尾插法 | O(n) | 需要遍历到最后 |
| 指定位置插入 | O(n) | 需要找到位置 |
| 删除 | O(n) | 需要查找 |
| 查找 | O(n) | 需要遍历 |
| 访问(按值) | O(n) | 不支持随机访问 |
对比数组:
| 操作 | 数组 | 链表 |
|---|---|---|
| 随机访问 | O(1) ✅ | O(n) ❌ |
| 头部插入 | O(n) ❌ | O(1) ✅ |
| 尾部插入 | O(1) ✅ | O(n)* |
| 中间插入 | O(n) | O(1)** |
*不考虑遍历时间
**已知插入位置的情况下
七、链表的应用场景
-
实现栈和队列 📚
- 栈的push/pop操作
-
哈希表的链地址法 🪣
- 解决哈希冲突
-
图的邻接表 🗺️
- 存储图的边
-
多项式运算 📐
- 表示多项式
-
内存管理 💾
- 空闲内存块管理
八、练习题 🎯
🏠 基础题
题目1:合并两个有序链表
将两个有序链表合并为一个新的有序链表。
c
// 示例
链表1: 1 -> 3 -> 5
链表2: 2 -> 4 -> 6
结果: 1 -> 2 -> 3 -> 4 -> 5 -> 6
题目2:删除倒数第N个节点
c
// 示例
链表: 1 -> 2 -> 3 -> 4 -> 5
删除倒数第2个节点
结果: 1 -> 2 -> 3 -> 5
💪 进阶题
题目3:环形链表II
找到环的入口节点。
题目4:合并K个有序链表
九、总结
今天我们深入学习了单链表:
✅ 链表概念:非连续存储,通过指针连接
✅ 节点结构:数据域 + 指针域
✅ 基本操作:头插、尾插、指定位置插入、删除、查找
✅ 经典问题:反转、求长度、找中间节点、判断环
✅ 复杂度分析:插入删除O(1),访问O(n)
记住:
- 链表是动态数据结构
- 插入删除效率高
- 不支持随机访问
- 注意内存管理(malloc/free)
十、下篇预告
下一篇我们将学习 双链表和循环链表------更强大的链表变体!
#mermaid-svg-DD2nwlW18Ks0jo5I{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DD2nwlW18Ks0jo5I .error-icon{fill:#552222;}#mermaid-svg-DD2nwlW18Ks0jo5I .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DD2nwlW18Ks0jo5I .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DD2nwlW18Ks0jo5I .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DD2nwlW18Ks0jo5I .marker.cross{stroke:#333333;}#mermaid-svg-DD2nwlW18Ks0jo5I svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DD2nwlW18Ks0jo5I p{margin:0;}#mermaid-svg-DD2nwlW18Ks0jo5I .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster-label text{fill:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster-label span{color:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster-label span p{background-color:transparent;}#mermaid-svg-DD2nwlW18Ks0jo5I .label text,#mermaid-svg-DD2nwlW18Ks0jo5I span{fill:#333;color:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I .node rect,#mermaid-svg-DD2nwlW18Ks0jo5I .node circle,#mermaid-svg-DD2nwlW18Ks0jo5I .node ellipse,#mermaid-svg-DD2nwlW18Ks0jo5I .node polygon,#mermaid-svg-DD2nwlW18Ks0jo5I .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DD2nwlW18Ks0jo5I .rough-node .label text,#mermaid-svg-DD2nwlW18Ks0jo5I .node .label text,#mermaid-svg-DD2nwlW18Ks0jo5I .image-shape .label,#mermaid-svg-DD2nwlW18Ks0jo5I .icon-shape .label{text-anchor:middle;}#mermaid-svg-DD2nwlW18Ks0jo5I .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DD2nwlW18Ks0jo5I .rough-node .label,#mermaid-svg-DD2nwlW18Ks0jo5I .node .label,#mermaid-svg-DD2nwlW18Ks0jo5I .image-shape .label,#mermaid-svg-DD2nwlW18Ks0jo5I .icon-shape .label{text-align:center;}#mermaid-svg-DD2nwlW18Ks0jo5I .node.clickable{cursor:pointer;}#mermaid-svg-DD2nwlW18Ks0jo5I .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DD2nwlW18Ks0jo5I .arrowheadPath{fill:#333333;}#mermaid-svg-DD2nwlW18Ks0jo5I .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DD2nwlW18Ks0jo5I .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DD2nwlW18Ks0jo5I .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DD2nwlW18Ks0jo5I .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DD2nwlW18Ks0jo5I .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DD2nwlW18Ks0jo5I .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster text{fill:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I .cluster span{color:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DD2nwlW18Ks0jo5I .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DD2nwlW18Ks0jo5I rect.text{fill:none;stroke-width:0;}#mermaid-svg-DD2nwlW18Ks0jo5I .icon-shape,#mermaid-svg-DD2nwlW18Ks0jo5I .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DD2nwlW18Ks0jo5I .icon-shape p,#mermaid-svg-DD2nwlW18Ks0jo5I .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DD2nwlW18Ks0jo5I .icon-shape .label rect,#mermaid-svg-DD2nwlW18Ks0jo5I .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DD2nwlW18Ks0jo5I .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DD2nwlW18Ks0jo5I .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DD2nwlW18Ks0jo5I :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} NULL
节点1
节点2
NULL
双链表可以双向遍历,循环链表首尾相连,让我们拭目待! 🚀
💡 学习建议:链表是数据结构的基础中的基础,一定要多画图理解指针的变化过程!
觉得有帮助就点赞+收藏+关注吧! 👍
有问题欢迎在评论区留言~ 💬