news 2026/3/12 3:08:39

单向链表的建立

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单向链表的建立

核心前提:带头结点链表的结构

先明确:头结点不存有效数据,仅作为链表的 “入口”,head->next指向第一个存储数据的结点。这是我们所有创建方法的基础,能避免空链表的特殊处理,新手优先掌握这种结构。


方法 1:尾插法

核心思路

  • 定义tail(尾指针),始终指向链表最后一个结点
  • 每新增一个结点,直接接在tail后面,然后更新tail到新结点;
  • 优点:插入效率高(不用每次找最后一个结点),链表中结点顺序和输入顺序一致。

适配学生信息链表的代码示例(完整可运行)

cpp

运行

#include<iostream> #include<string> using namespace std; struct student { string id; string nm; string cj; student* next; }; // 尾插法创建学生链表(封装成函数,更清晰) student* createListByTail() { // 1. 创建头结点 student *head = new student(); head->next = nullptr; student *tail = head; // 尾指针初始指向头结点 string a, b, c; while (true) { cin >> a >> b >> c; if (a == "0") break; // 输入0结束 // 2. 创建新结点并赋值 student *newNode = new student(); newNode->id = a; newNode->nm = b; newNode->cj = c; newNode->next = nullptr; // 3. 尾插核心:接在tail后面,更新tail tail->next = newNode; tail = newNode; } return head; } // 遍历输出链表 void printList(student* head) { student *p = head->next; while (p != nullptr) { cout << p->id << " " << p->nm << " " << p->cj << endl; p = p->next; } } int main() { student *head = createListByTail(); cout << "尾插法创建的链表:" << endl; printList(head); // 释放内存(省略,和之前一致) return 0; }

尾插法关键步骤(白话版)

  1. 造一个 “空盒子”(头结点),tail先 “抓着” 这个空盒子;
  2. 输入数据→造新盒子存数据→把tail抓着的盒子的 “尾巴”(next)连到新盒子;
  3. tail松开原来的盒子,改抓新盒子(下次新盒子就接在这);
  4. 重复直到输入 0,链表就建好了。

方法 2:头插法(逆序插入,适合需要反转顺序的场景)

核心思路

  • 不设尾指针,每新增一个结点,直接插在头结点和第一个有效结点之间
  • 优点:插入更简单(不用维护 tail);缺点:链表中结点顺序和输入顺序相反

适配学生信息链表的代码示例

cpp

运行

#include<iostream> #include<string> using namespace std; struct student { string id; string nm; string cj; student* next; }; // 头插法创建学生链表 student* createListByHead() { // 1. 创建头结点 student *head = new student(); head->next = nullptr; string a, b, c; while (true) { cin >> a >> b >> c; if (a == "0") break; // 2. 创建新结点并赋值 student *newNode = new student(); newNode->id = a; newNode->nm = b; newNode->cj = c; // 3. 头插核心:先连后面,再接头结点 newNode->next = head->next; // 新结点的next指向原来的第一个有效结点 head->next = newNode; // 头结点的next指向新结点(新结点成第一个) } return head; } // 遍历输出链表 void printList(student* head) { student *p = head->next; while (p != nullptr) { cout << p->id << " " << p->nm << " " << p->cj << endl; p = p->next; } } int main() { student *head = createListByHead(); cout << "头插法创建的链表(顺序反转):" << endl; printList(head); // 释放内存(省略) return 0; }

头插法关键步骤(白话版)

  1. 造一个 “空盒子”(头结点);
  2. 输入数据→造新盒子存数据;
  3. 新盒子先 “抓着” 原来第一个有数据的盒子;
  4. 头结点松开原来的第一个盒子,改抓新盒子(新盒子变成第一个);
  5. 重复直到输入 0,链表建好(输入顺序 101→102→103,输出会是 103→102→101)。

两种方法对比(新手必看)

方法核心指针结点顺序适用场景
尾插法tail和输入顺序一致大多数场景(如存储学生信息)
头插法无(只用 head)和输入顺序相反需要反转顺序、栈结构等场景

总结(核心要点)

  1. 带头结点链表创建的基础步骤:先创建头结点→循环输入数据→创建新结点赋值→插入链表→结束循环;
  2. 尾插法是新手优先掌握的方法,核心是维护tail指针,保证结点顺序和输入一致;
  3. 头插法不用维护tail,但会反转顺序,适合特定场景;
  4. 无论哪种方法,新结点的next必须设为nullptr(尾插)或head->next(头插),避免野指针。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/17 13:22:46

震惊!延安市这些家电门店竟能送货,你知道几家?

震惊&#xff01;延安市这些家电门店竟能送货&#xff0c;你知道几家&#xff1f;在延安市&#xff0c;购买家电时能享受到送货服务是众多消费者的期望。如今&#xff0c;有一些家电门店凭借优质的送货服务脱颖而出&#xff0c;其中京东家电专卖店十字街店就是值得关注的一家。…

作者头像 李华
网站建设 2026/3/10 11:41:49

《Python 257 之谜:从对象模型到内存优化的全景深度解析》

《Python 257 之谜:从对象模型到内存优化的全景深度解析》 ——为什么 a = 257; b = 257; print(a is b) 输出 False? 一、开篇:从一个“False”说起 如果你写过 Python,你一定见过这段代码: a = 257 b = 257 print(a is b) # False而当你把 257 换成 256: a =

作者头像 李华
网站建设 2026/3/11 20:06:41

Excalidraw监控告警体系:异常行为及时发现

Excalidraw监控告警体系&#xff1a;异常行为及时发现 在一次深夜的线上故障中&#xff0c;SRE 团队接到告警&#xff1a;订单服务响应延迟飙升至 5 秒以上。值班工程师迅速登录 Grafana 查看指标&#xff0c;同时在 Slack 中 相关成员。然而&#xff0c;问题很快浮现——有人不…

作者头像 李华
网站建设 2026/3/10 15:21:45

Excalidraw迭代器模式遍历:集合元素逐个访问

Excalidraw 中的迭代器模式&#xff1a;如何优雅地遍历复杂画布元素 在现代协作式设计工具中&#xff0c;一个看似简单的“遍历所有图形”操作背后&#xff0c;往往隐藏着复杂的架构考量。以开源手绘风白板工具 Excalidraw 为例&#xff0c;当用户在一个包含数百个矩形、箭头和…

作者头像 李华
网站建设 2026/3/10 21:50:44

Excalidraw鼠标右键菜单:快捷入口提高效率

Excalidraw中的右键菜单&#xff1a;效率背后的智能交互设计 在远程协作成为常态的今天&#xff0c;团队对可视化工具的要求早已超越“能画图”的基础功能。设计师、工程师和产品经理需要的是一个既能快速表达想法&#xff0c;又能高效协同修改的数字白板。Excalidraw 正是在这…

作者头像 李华
网站建设 2026/2/21 22:27:40

Excalidraw缓存策略设计:减少重复计算开销

Excalidraw缓存策略设计&#xff1a;减少重复计算开销 在AI驱动的协作工具日益普及的今天&#xff0c;一个看似简单的问题却频频困扰开发者——用户反复输入“画一个微服务架构图”&#xff0c;系统是否每次都得重新调用大模型生成一遍&#xff1f;对于Excalidraw这类基于自然语…

作者头像 李华