数据结构-2.8.单链表的建立

news2024/9/20 17:58:00


一.尾插法建立单链表:取数据元素插入单链表表尾

1.图解:

对于时间复杂度,最好的时间复杂度是第一次,因为此时内层循环即找第i-1个结点就不执行了(不满足j<i-1),

内层循环和外层循环时间复杂度都是O(n),所以整个尾插操作的时间复杂度为O(n * n)。

(i为1时内层循环走0次,i为2时内层循环走1次,以此类推,i为n时内层循环走n-1次,那么一共走

0+1+2+...+(n-1)次,易知时间复杂度为O(n * n) )

但这个时间复杂度较高,因此没必要每次都从头开始寻找,可以设置一个指针指向表尾的最后一个数据结点,

然后当要在尾部插入一个新的数据元素时只需要对尾部结点进行后插操作即可:

后插后还需要把表尾指针向后移指向新的表尾数据结点:

2.代码演示:

#include<stdio.h>
#include<stdlib.h>
​
​
//定义单链表结点类型 
typedef struct LNode
{ 
    int data; //每个结点存放的数据元素 
    struct LNode *next; //指向下一个节点的指针,是链表型 
}LNode,*LinkList;
​
​
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    //1.分配一个头结点
    L = (LNode*)malloc( sizeof(LNode) );
    //2.头结点判断
    if( L==NULL )
    {
        //代表头结点分配失败,比如内存不足 
        return false;
    }  
    /*3.走到这儿说明头结点分配成功
        由于第一个结点没存数据,所以第一个结点为NULL*/
    L->next = NULL;
    //4.分配成功
    return true;     
} 
​
​
//正向建立单链表
LinkList List_TailInsert(LinkList &L)
{
    //1.设置结点
    int x;
    /*2.建立头结点(头结点里的指针没必要设为NULL了,
                   因为之后必要加一个元素,头结点指向的元素一定不为空) */
    L = (LinkList)malloc( sizeof(LNode) );//初始化单链表 
    //3.设置表尾指针r
    LNode *r=L;
    LNode *s;
    //4.输入结点的值即要插入单链表的元素 
    scanf("%d",&x);
    //5.输入9999表示结束,9999不是固定的 
    while( x!=9999 )
    {
        s = (LNode *)malloc( sizeof(LNode) );
        s->data = x;
        r->next = s;
        //6.r指向新的表尾结点
        r=s;
        scanf("%d",&x); 
    } 
    //7.把尾结点指针置空
    r->next = NULL;
    return L; 
} 
​
​
int main()
{
    //1.声明一个指向单链表的指针
    LinkList L;
    //2.初始化一个空表
    InitList(L); 
    return 0;
}
该代码的图解:while循环就是插入操作核心

x为要插入单链表的元素,L为头结点(头结点里的指针没必要设为NULL了,因为之后必要加一个元素,头结点指向的元素一定不为空),*r代表表尾指针,一开始只有一个,表头即表尾:

假设x(x为要插入单链表的元素)为10,符合while循环条件,给要插入单链表的元素先分配一个空间,在再空间中存入元素,最后修改指针即r->next=s,此时表尾结点为s,则r=s:

注:r始终指向新的表尾结点。

之后以此类推,直到x不符合循环条件时停止插入,while循环结束(此时x为9999)后r->next=NULL即表尾后就是空的,代表单链表结束,最后返回新的单链表:

3.时间复杂度:如果插入n个结点则循环n次,所以时间复杂度为O(n)


二.头插法建立单链表:取数据元素插入单链表表头->可以使数据元素逆置

例如:

单链表表头插入11后为:

核心:相当于对头结点的后插操作即对指定结点的后插操作

1.图解:

2.代码演示:

#include<stdio.h>
#include<stdlib.h>
​
​
//定义单链表结点类型 
typedef struct LNode
{ 
    int data; //每个结点存放的数据元素 
    struct LNode *next; //指向下一个节点的指针,是链表型 
}LNode,*LinkList;
​
​
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    //1.分配一个头结点
    L = (LNode*)malloc( sizeof(LNode) );
    //2.头结点判断
    if( L==NULL )
    {
        //代表头结点分配失败,比如内存不足 
        return false;
    }  
    /*3.走到这儿说明头结点分配成功
        由于第一个结点没存数据,所以第一个结点为NULL*/
    L->next = NULL;
    //4.分配成功
    return true;     
} 
​
​
//逆向建立单链表
LinkList List_HeadInsert(LinkList &L)
{
    LNode *s;
    //1.设置结点即要插入的元素 
    int x;
    //2.创建头结点
    L = (LinkList)malloc( sizeof(LNode) );
    //3.初始为空链表
    L->next = NULL;
    //4.输入结点的值
    scanf("%d",&x);
    //5.输入9999表示结束
    while( x!=9999)
    {
        s = (LNode *)malloc( sizeof(LNode) ); //创建新结点
        s->data = x;
        s->next = L->next;
        L->next = s; //将新结点插入表中,L为头指针
        scanf("%d",&x); 
    } 
    return L; 
} 
​
​
int main()
{
    //1.声明一个指向单链表的指针
    LinkList L;
    //2.初始化一个空表
    InitList(L); 
    return 0;
}
该代码的图解:while循环就是插入操作核心

1)x为要插入单链表的元素,先对单链表初始化即分配存储空间,再让p->next=NULL,初始为空链表:

注:

左部分代码中L->next=NULL不能省,如果省了,L->next(头结点指针)就有可能是一片神秘的未知区域,因为像这种

malloc动态分配申请的这片内存空间中可能有脏数据,如果不把L->next初始化,就不知道L->next是何物了,而且最后

实现插入后始终指向一片未知区域(每次插入都在头结点之后插,不影响尾结点):

2)while循环实现了后插操作,只不过每次执行后插操作的指定结点都是头结点

while循环中首先给要插入单链表的元素分配一个空间,在再空间中存入元素,再修改指针,

L->next一开始是秘:

根据题意,要让插入的元素即x指向秘,因此s->next = L->next :

最后把x接到头指针后面即可:

3.举例:

依次插入10,16,27,9999:

结果刚好和输入的顺序相反(因为每次插入都在头结点之后插),因此头插法建立单链表可以实现数据元素逆置

->对此,要想逆置一个单链表,可以依次取出该单链表的元素(用指针循环扫描依次取得元素),再利用头插法就可以实现

该单链表的原地逆置,也可以建立新链表把取出的元素利用头插法存入该新链表中;

也可以建立新链表,把要逆置的链表从后往前依次存入新链表实现逆置。


三.总结:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

devops的道法术器

devops的道法术器 道、法、术、器自上而下是系统思考的层次&#xff0c;自下而上是解决问题的层次 “道”是目标、价值观&#xff0c;对价值的定位。 快速交付价值&#xff0c;灵活响应变化&#xff0c;这是从价值层面的追求&#xff0c;或者是从第一性原理的角度来讲&#xf…

相亲交友系统 现代爱情的导航仪

在这个数字化的时代&#xff0c;人们的生活方式发生了翻天覆地的变化&#xff0c;其中最显著的变化之一便是交友方式的转变。编辑h17711347205随着社会节奏的加快&#xff0c;越来越多的人选择通过相亲交友系统来寻找人生伴侣。相亲交友系统不仅简化了传统的交友流程&#xff0…

pig4cloud自定义SecurityFilterChain、Filter

1. 环境 SpringBoot版本&#xff1a;2.7.16 SpringSecurity版本&#xff1a;5.7.11 pig4cloud版本&#xff1a;3.7.1-JDK8 2. 概述 pig4cloud也没有自定义SecurityFilterChain的实现&#xff0c;还是基于SpringSecurity去实现的。但是pig4cloud使用的SpringSecurity的5.7.…

鸿蒙手势交互(四:多层手势)

四、多层手势 指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。有两种&#xff0c;一种默认多层级手势事件&#xff0c;一种自定义多层级手势事件。 默认多层级手势事件&#xff1a;需要分清两个概念&#xff0c;触摸事件&#xff0c;手势与事件 触摸事件&#xf…

MySQL数据库:掌握备份与恢复的艺术,确保数据安全无忧(二)

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 ​编辑 正…

springbootKPL比赛网上售票系统

基于springbootvue实现的KPL比赛网上售票系统 &#xff08;源码L文ppt&#xff09;4-068 4.2 系统结构设计 架构图是系统的体系结构&#xff0c;体系结构是体系结构体系的重要组成部分。KPL比赛网上售票系统的总体结构设计如图4-2所示。 图4-2 系统总体架构图 4.3数据…

【Java面向对象二】static(二)修饰成员方法的应用场景

文章目录 前言一、static修饰成员方法的应用场景二、使用例子三、工具类没有创建对象的需求&#xff0c;建议将工具类的构造方法进行私有总结 前言 记录学习过程中的工具类的使用。 一、static修饰成员方法的应用场景 1、类方法的常见应用场景 类方法最常见的应用场景是做工…

Java设计模式——工厂方法模式(完整详解,附有代码+案例)

文章目录 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现 5.3 工厂方法模式 针对5.2.3中的缺点&#xff0c;使用工厂方法模式就可以完美的解决&#xff0c;完全遵循开闭原则。 5.3.1概述 工厂方法模式&#xff1a;定义一个创建对象的接口&#xff08;这里的接口指的是工厂&…

01_WebRtc_一对一视频通话

文章目录 通话网页的设计客户端实现Web的API 服务端实现 2024-9-20 很久没有写博客啦&#xff0c;回顾总结这段时间的成果&#xff0c; 写下博客放松下&#xff08;开始偷懒啦&#xff09;主要内容&#xff1a;实现网页&#xff08;html&#xff09;打开摄像头并显示到页面需要…

泳池软管检测系统源码分享

泳池软管检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++: 使用红黑树模拟实现STL中的map和set

目录 1. 红黑树的迭代器和-- 2. 改造红黑树3. set的模拟实现4. map的模拟实现5. RBTree的改造代码 博客主页 : 酷酷学 正文开始 1. 红黑树的迭代器 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明 打开C的源码我们可以发现, 其实源码中的底层大概如…

数据结构应试-树和二叉树

1. 2. 结点的度&#xff1a;结点拥有的子树数量称为结点的度 树的度&#xff1a;树内各结点度的最大值&#xff0c;即上图 D 结点的度就是此树的度 叶子&#xff1a;度为 0 的节点称为叶子或终端节点 结点的层次和树的深度 森林&#xff1a;m棵互不相交的树的集合。 3. 为啥…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

layui时间选择器选择周 日月季度年

<!-- layui框架样式 --><link type"text/css" href"/static/plugins/layui/css/layui.css" rel"stylesheet" /><!-- layui框架js --><script type"text/javascript" src"/static/plugins/layui/layui.js&qu…

【LeetCode】每日一题 2024_9_20 统计特殊整数(数位 DP)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计特殊整数 代码与解题思路 func countSpecialNumbers(n int) int { // 今天的题目是数位 DP&#xff0c;我不会做&#xff0c;所以现场学习了一下灵神的数位 DP 模版s : strconv.Itoa…

11个推特大V发文推广的数据分析技巧

社交媒体已经成为了现代社会中不可或缺的一部分&#xff0c;而推特作为其中的重要一员&#xff0c;吸引了许多用户。对于那些成千上万的粉丝拥有者&#xff08;也被称为“大V”&#xff09;&#xff0c;他们能够有效地利用推特平台&#xff0c;推广自己的观点和产品。我们将介绍…

让医院更智慧,让决策更容易

依托数字孪生技术&#xff0c;赋能智慧医院&#xff0c;对使用者和决策者带来了众多的优势。数字孪生技术是将物理实体与数字模型相结合&#xff0c;实现实时监测、仿真预测和智能决策的一种先进技术。在智慧医院中应用数字孪生技术&#xff0c;不仅可以提升医疗服务的质量和效…

阿里云容器服务Kubernetes部署新服务

这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息&#xff1a; 容器配置&#xff1a; 高级配置&#xff1a; 创建成功后就可以通过30006端口访问项目了

XML:DOM4j解析XML

XML简介&#xff1a; 什么是XML&#xff1a;XML 是独立于软件和硬件的信息传输工具。 XML 的设计宗旨是传输数据&#xff0c;而不是显示数据。XML 标签没有被预定义。您需要自行定义标签。XML不会做任何事情&#xff0c;XML被设计用来结构化、存储以及传输信息。 XML可以发明…

再次理解UDP协议

一、再谈端口号 在 TCP / IP 协议中&#xff0c;用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 我们需要端口号到进程的唯一性&#xff0c;所以一个…