单链表是编程入门必学的线性数据结构相比于数组它无需连续的内存空间插入或者删除操作无需移动大量元素是理解指针和链式存储的核心载体本文将会用简单的代码实现单链表的核心功能适合零基础的新手快速上手并理解。1、单链表的核心概念单链表是若干个节点串联而成每个节点包含两部分数据域存储实际数据指针域存储下一个结点的内存地址最后一个结点的指针域为nullptr空指针表示链表结束链表的访问方式为顺序访问----必须从头节点开始通过指针逐个遍历不能像数组一样随机访问直接通过下标访问取值2、极简的单链表实现以下代码仅仅保留单链表最核心的三个功能尾插添加节点遍历输出删除指定值#includeiostreamusingnamespacestd;// 1. 定义单链表节点结构体// 每个节点包含数据域和指针域structNode{intdata;// 数据域存储整型数据可根据需求改为其他类型Node*next;// 指针域指向链表中下一个节点的指针// 节点构造函数创建节点时直接初始化数据和指针// 避免每次创建节点都手动赋值简化代码Node(intval):data(val),next(nullptr){}};// 2. 尾插法添加节点核心功能1// 功能在链表的末尾添加新节点// 参数head为链表头节点的引用需修改头节点故用引用val为要添加的数据voidaddNode(Node*head,intval){// 1. 创建新节点初始化数据为val指针为空Node*newNodenewNode(val);// 2. 处理空链表如果头节点为空新节点直接作为头节点if(headnullptr){headnewNode;return;}// 3. 非空链表遍历到链表最后一个节点Node*curhead;// 定义遍历指针从头节点开始// 循环条件当前节点的下一个节点不为空未到末尾while(cur-next!nullptr){curcur-next;// 指针后移指向下一个节点}// 4. 将最后一个节点的指针指向新节点完成插入cur-nextnewNode;}// 3. 遍历链表并输出核心功能2// 功能从头节点开始逐个输出所有节点的数值// 参数head为链表头节点仅读取无需修改故不用引用voidtraverse(Node*head){// 处理空链表if(headnullptr){cout当前链表为空无数据可输出endl;return;}// 非空链表逐个遍历输出cout链表数据;Node*curhead;// 遍历指针从头节点开始while(cur!nullptr){coutcur-data ;// 输出当前节点数据curcur-next;// 指针后移}coutendl;// 换行优化输出格式}// 4. 删除指定值的节点核心功能3// 功能删除链表中第一个值为val的节点// 参数head为链表头节点的引用可能修改头节点故用引用val为要删除的数据voiddeleteNode(Node*head,intval){// 1. 处理空链表直接返回无需操作if(headnullptr){cout链表为空无法删除节点endl;return;}// 2. 处理头节点就是目标节点的情况if(head-dataval){Node*temphead;// 暂存头节点用于释放内存headhead-next;// 头节点后移指向原第二个节点deletetemp;// 释放原头节点内存避免内存泄漏cout已删除头节点值为valendl;return;}// 3. 处理中间/末尾节点找到目标节点的前驱节点Node*curhead;// 遍历指针从头节点开始// 循环条件下一个节点不为空且下一个节点的值不等于目标值while(cur-next!nullptrcur-next-data!val){curcur-next;// 指针后移}// 4. 判断是否找到目标节点if(cur-nextnullptr){cout未找到值为val的节点删除失败endl;}else{Node*tempcur-next;// 暂存待删除节点cur-nextcur-next-next;// 前驱节点跳过待删除节点指向其后继节点deletetemp;// 释放待删除节点内存cout已删除值为val的节点endl;}}// 主函数测试单链表所有功能intmain(){Node*headnullptr;// 初始化头节点为空代表空链表// 1. 添加节点尾插1、2、3addNode(head,1);addNode(head,2);addNode(head,3);traverse(head);// 输出链表数据1 2 3// 2. 删除节点删除值为2的节点deleteNode(head,2);traverse(head);// 输出链表数据1 3// 3. 测试删除不存在的节点deleteNode(head,5);// 输出未找到值为5的节点删除失败// 4. 测试删除头节点deleteNode(head,1);traverse(head);// 输出链表数据3return0;}3、运行结果4、核心逻辑解析节点定义用结构体封装数据域和指针域构造函数简化节点初始化避免重复写赋值代码尾插添加核心是找到最后一个节点通过遍历指针cur等到cur-next为空再将新的节点挂到末尾遍历输出从头结点开始逐个反复问加点并输出数据直到指针为空删除节点分三种情况处理空链表删除头节点删除中间末尾节点重点是“找到前驱节点”并记得释放内存避免泄露5、总结单链表的核心是指针操作所有功能都围绕着遍历“指针找目标节点”展开实现时必须处理Nullptr否则会导致程序崩溃本文极简代码覆盖了单链表的核心场景新手掌握后可扩展头插指定位置插入清空链表等功能