【单链表】大数据,请把它推给还不会单链表的人(上)

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 【单链表】大数据,请把它推给还不会单链表的人

前言: 刷题和面试兼顾还得看你啊-牛客网


近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人


很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫


牛客网提供了语言巩固,算法提高等在线OJ题,更有面试真题,大厂内推!


链接附上点击链接注册牛客网


牛客网这么好用,但是下面几个关于牛客网的知识你了解过吗?


你知道你OJ过不了,牛客网几种经典的英文报错提示的含义吗?

你知道牛客网的OJ分为IO型和接口型吗?

你使用过牛客网的调试功能吗?


一.基本介绍:

1.链表的每一个结点都包含两个域:数据域和指针域

image.png


2.其实计算机中并没有指针的指向,箭头指向只是人为假象出来的,实际上指针域存储的是下一个结点的地址。


4f531e696f5a46d382f5ede7f5953323.png


3.链表的种类:链表的种类从三对修饰词中每对修饰词中选出一个,例如我们今天讲的就是不带头单向不循环链表


a6eb4f415f664dbdb5d5f6276fd43586.png


4.左值和右值问题


拿这个曾经卡死你的那个插入结点的代码为例来讲解:


ebedf18f7f1540089bd0b238bac05003.png

248fcd7b80b046a78c35bc2c31b8989c.png

bb2f274b5a9147c4b7fe98269d89ed20.png


备注:这里要从没有标记的一端开始修改,也就是先执行s->next=p->next,


后执行p->next=s     ,因为如果先执行p->next=s;就会找不到p原来后面的那个结点了,这和顺序表的从哪一端开始移动很像!


5.单链表较动态顺序表:


动态顺序表:


优点:只用通过数组下标访问的方式就可以随机访问某一个数组元素并进行操作,时间复杂度低;


缺点:当要删除或插入元素的时候不得不移动大量元素,时间复杂度高;


单链表(single  list 常简写为 SLT)


优点:当要删除或插入元素的时候不用移动大量元素,时间复杂度低;


缺点:当要访问某一个结点并进行操作的时候要从头开始遍历,时间复杂度高;


6.要想学会单链表你得了解这些(上面没有讲到的下面会一一讲到)

c4b0de372a994cd0bd54c2af4d460970.png

🚗🚗🚗🚗🚗🚗🚗这里是正文接口分界线🚗🚗🚗🚗🚗🚗🚗🚗🚗

二.单链表基本操作

1.打印单链表

void SListPrint(SLTNode* plist)
{
  SLTNode* cur = plist;
  while (cur != NULL)
  {
    printf("%d->", cur->data);
    cur = cur->next;
  }
  printf("NULL\n");
}

备注;在对每一个接口进行测试的时候,通过打印结果来观察测试接口的正确与否


8ff337c5251b48eebe520bc9e1ee1fba.png


2.构造结点

每次插入前都要构造一个新结点,这一步模块化代码是不是和顺序表的插入前检查是否需要扩容很像!哈哈哈

SLTNode* BuySLTNode(SLTDataType x)
{
  SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
  newnode->data = x;
  newnode->next = NULL;
  return newnode;
}

注意:返回类型是SLTNode*类型

7db06866b70440cdac54f9ff45dc0cfe.png

3.尾插:在单链表尾部插入一个结点

关于哨兵位的头结点:(先给结论吧)


总结:如果带头结点的单链表在进行操作时,就可以使得每一个带数据元素的结点都有前驱结点,就可以统一操作这些带 数据元素的结点,就可以不用考虑一些特殊情况。


但是如果是不带头结点的单链表在进行操作时,第一个结点(也就是第一个带数据元素的结点)没有前驱结点,所以操作起来要对第一个结点特殊考虑。


一:(不带头结点的话)还是借一借排队的例子和你讲一讲,你在食堂排队打饭,你老老实实排队(尾插),会遇到两种情况:(一个不太恰当的例子)


1.一般情况,原队伍有人,那你(待插入的结点)就要通过“指针”和这原队伍最后一个学生(最后一个结点)关联起来


2:特殊情况:原队伍没人,那你通过指针关联起来的就不再是学生,而是“食堂阿姨”,对待长辈肯定会有所拘谨,那么这就会产生细微的区别,要特殊考虑。


二:(带头结点的话)但是下一篇博客就会提到,当我们用一个学生去代替食堂阿姨打饭的位置,无论原队伍没人还是原队伍有人打饭交接的内容就可以统一(排队的同学才是相当于带头结点中那些带有数据元素的结点,需要我们进行单链表的打印等操作,所以不必再考虑头结点和头指针的关联问题)。

void SListPushBack(SLTNode** pplist, SLTDataType x)
{
  SLTNode* newnode = BuySLTNode(x);
  if (*pplist == NULL)
  {
    *pplist = newnode;
  }
  else
  {
    SLTNode* tail = *pplist;
    while (tail->next != NULL)
    {
      tail = tail->next;
    }
    tail->next = newnode;
  }
}

da58d7c1f7874da38a21369701946176.png

命名:push 压入             pop弹出

         back尾                        front 头


相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
2月前
|
存储 缓存 算法
链表全景:探索单链表、双向链表与循环链表【实战演练】
链表全景:探索单链表、双向链表与循环链表【实战演练】
37 3
|
2月前
|
存储
【单链表】数据结构单链表的实现
【单链表】数据结构单链表的实现
|
2月前
leetcode:203. 移除链表元素(有哨兵位的单链表和无哨兵位的单链表)
leetcode:203. 移除链表元素(有哨兵位的单链表和无哨兵位的单链表)
24 0
|
17天前
|
存储
链表入门(单链表讲)
链表入门(单链表讲)
链表入门(单链表讲)
|
5天前
|
存储
【海贼王的数据航海】链表—单链表
【海贼王的数据航海】链表—单链表
8 0
|
2月前
|
存储 编译器
单链表与双链表实现
单链表与双链表实现
27 4
|
2月前
特殊链表(循环单链表,循环双链表,静态链表)
特殊链表(循环单链表,循环双链表,静态链表)
23 3
|
25天前
|
算法
数据结构和算法学习记录——线性表之单链表(下)-头插函数、尾删函数、头删函数、查找函数、pos位置插入&删除数据、单链表销毁
数据结构和算法学习记录——线性表之单链表(下)-头插函数、尾删函数、头删函数、查找函数、pos位置插入&删除数据、单链表销毁
23 0
|
25天前
|
存储 算法
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
16 0
|
2月前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
30 0