02-单链表完全指南

C语言数据结构系列:链表篇

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)**

*不考虑遍历时间

**已知插入位置的情况下


七、链表的应用场景

  1. 实现栈和队列 📚

    • 栈的push/pop操作
  2. 哈希表的链地址法 🪣

    • 解决哈希冲突
  3. 图的邻接表 🗺️

    • 存储图的边
  4. 多项式运算 📐

    • 表示多项式
  5. 内存管理 💾

    • 空闲内存块管理

八、练习题 🎯

🏠 基础题

题目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)

记住:

  1. 链表是动态数据结构
  2. 插入删除效率高
  3. 不支持随机访问
  4. 注意内存管理(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

双链表可以双向遍历,循环链表首尾相连,让我们拭目待! 🚀


💡 学习建议:链表是数据结构的基础中的基础,一定要多画图理解指针的变化过程!

觉得有帮助就点赞+收藏+关注吧! 👍

有问题欢迎在评论区留言~ 💬

相关推荐
ltqshs1 小时前
C语言-链表例程
c语言·开发语言·链表
生态学者1 小时前
香港理工大学Nature Communications:沿海塑料际古菌组特征及生态影响
大数据·人工智能·算法·r语言·微信公众平台
Lyyaoo.1 小时前
【链表】【中等】两数相加/倒N删除/两个交换/排序链表/LRU缓存
数据结构·链表·缓存
圣保罗的大教堂1 小时前
leetcode 3904. 最小稳定下标 II 中等
leetcode
YYYing.1 小时前
【C++进阶系列 (一)】关于线程堆栈的那些事 (上篇)
c语言·开发语言·c++·线程堆栈
Discipline~Hai1 小时前
Linux网络编程05-sqlite3数据库
linux·c语言·网络·数据库·sqlite·linux应用软件编程
bro_Java6661 小时前
链表进阶:链表笔试真题
数据结构·链表
ly-272531 小时前
IEEE PDF eXpress终稿检测踩坑记录:PDF图片字体未嵌入与LaTeX参考文献编译异常解决方法
服务器·人工智能·算法
代码不停1 小时前
子序列问题
java·算法