目录

1.顺序表&链表的优点和缺点

2.单链表和双向循环链表

3.一点杂七杂八的东西

3-1顺序表和链表打印的断言

3-2.栈上和堆上定义一个新节点

3-3.二级指针

3-4.哨兵头结点的作用

3-5 为什么单链表的基本操作中无tail记录尾

4.替换法删除pos结点

4-1.变式

5 .链表调试

6.为什么学校老师讲的时候不先讲带头结点的

7.刷刷刷题

7-1.回文链表

7-2.相交链表

7-3. 链表分割


1.顺序表&双向循环链表的优点和缺点

顺序表:

一.优点:

  1. 尾插尾删效率很高
  2. 支持用下标随机访问

二.缺点:

  1. 头部和中部插入和删除效率低O(n)
  2. 扩容-----性能消耗+空间消耗

双向循环链表:

一.优点:

  1. 任意位置插入删除效率很高O(1)
  2. 按需申请释放

二.缺点:

  1. 不支持随机访问

综合而言,两个各有优缺,相辅相成,具体用谁看场景,但是总体而言顺序表使用的频率更高一点

扩展一点:

顺序表的cpu高速缓存命中率高(顺序表空间连续)

2.单链表和双向循环链表

1.单链表:其他结构的子结构(比如哈希桶),面试经常问到和OJ题目,且只适合头部的插入删除。

2.双向循环链表:结构复杂,但是实现简单,最为实用,常被用于实际存数据,适合任意位置的插入删除。

3.一点杂七杂八的东西

3-1顺序表和链表打印的断言

1.顺序表和链表打印断言顺序表定义:SeqList Sq;
在传给打印函数的时候:SeqListPrint(&Sq)
在函数内部的时候&Sq一定不为空,void SeqListPrint(SeqList* ps)所以要断言一下assert(ps);单链表定义变量: SLTNode* phead;
在传给打印函数的时候:SLTNodePrint(&phead);
在函数内部打印的时候phead为空的时候,&phead也可能为空,所以不能断言

但是注意:虽然phead为空,但是pphead不为空 ,所以在链表头插函数内部还是要对pphead断言。

原因:phead没有指向任何内容,但是phead本身是一个指针变量,是变量就有地址。

3-2.栈上和堆上定义一个新节点

2.栈(错)和堆上(对)定义一个新节点void SLTNodePushFront(SLTNode** pphead,STDateType x)
{//错误示范:栈上开辟的,出函数销毁SLTNode newnode;//正确做法:malloc结点,堆上开辟,空间需要手动释放SLTNode* newhead=(SLTNode*)malloc(sizeof(SLTNode));
}

3-3.二级指针

我们在主函数定义了SListNode*  plist;

在改变plist的指向的时候就要传二级指针,但是如果在函数内改结点,直接用一级指针就能改,就像我们在函数内部定义的prev,cur等。这也就是哨兵位头结点的原理,在因为有哨兵位的头结点,就不用改plist,所以可以在主函数内传一级指针。

3.二级指针以尾插函数为例,如果主函数里的plist为空,那么要改plist就要传二级指针
但是为什么在plist不为空的时候,要尾插一个void SLTNodePushBack(SLTNode* pphead, SLTDateType x)//1
{assert(pphead);//2SLTNode* newhead = (SLTNode*)malloc(sizeof(SLTNode));newnode->next = NULL;newnode->date = x;if (*pphead == NULL){*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail){tail = tail->next;}tail->next = newnode;//3}
}

无头单向不循环链表传二级指针发挥作用的情况:

  • 没有结点尾插
  • 只有一个结点尾删
  • 头插
  • 头删
  • 销毁

3-4.哨兵头结点的作用

头结点的作用:

  1. 方便对plist为空等特殊情况时的统一操作
  2. 避免传二级指针

备注:有人说哨兵位头结点的数据域是用来存储单链表的长度;

专业打假:其实这种说法是错误的,因为结点的数据域为char类型的且链表长度大于127的时候就会溢出,所以这种说法是错误的。

3-5 为什么单链表的基本操作中无tail记录尾

看过我写题的应该知道,在建立新链表的时候,通常是采用尾插操作,尾插相对于头插能够保证新链表的结点在原链表的相对顺序不变,但是尾插的缺点是每次尾插都要找尾,所以我们定义一个尾指针,实时更新尾指针。

那为什么单链表的基本操作中无tail记录尾?那是因为在基本操作中不止有尾插,还有尾删,定义一个tail效果适用性不是很强。

4.替换法删除pos结点

基于单链表删除pos位置还要找尾的麻烦,删除pos位置的结点有一个替换法删除,数据域值交换的方法,时间复杂度是O(1):

如果要删除pos位置的结点,则可以狸猫换太子把pos后面一个结点的值给pos位置的数据域,然后pos->next=pos->next->next,也就是把pos后面那个结点作替死鬼。

缺点:pos位置不能是尾结点。

pos位置是尾结点且链表是循环链表就可以,但是如果是循环链表的话就没必要使用替换法删除pos位置的结点.

4-1.变式

如果要在pos位置之前插入一个结点,时间复杂度为O(1),也可以采用这种方法:

BuySListNode(pos->val);

pos->val=x;

5 .链表调试

当OJ写不出来,想在VS上调试代码,找Bug,但是每次还要重建链表?有什么解决办法?

备注:程序员一半的时间都在改Bug,你连调试都不会,就等着扣绩效吧

【数据结构初阶】单链表补充内容+又双叒叕刷链表题相关推荐

  1. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

  2. 数据结构初阶最终章------>经典八大排序(C语言实现)

    前言:   正如标题所言,本篇博客是数据结构初阶的最终章节.但不是数据结构的最终章节!事实上,诸如AVL 树,红黑树这样高阶复杂的数据结构使用C语言非常麻烦,这些数据结构我会放在后续的C++的博客中去 ...

  3. 数据结构初阶——第三节-- 单链表

    链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...

  4. 【数据结构初阶】链表(下)——带头双向循环链表的实现

    目录 带头双向循环链表的实现 1.带头双向循环链表的节点类型 2.创建带头双向循环链表的节点 3.向带头双向循环链表中插入数据 <3.1>从链表尾部插入数据 <3.2>从链表头 ...

  5. 数据结构初阶:二叉树

    二叉树 链表和数组都是线性结构,而树是非线性的结构. 树是依靠分支关系定义出的一种层次结构.社会亲缘关系和组织结构图都可以用树来形象地表示. 1. 树 1.1 树的定义 树是 n ( n ≥ 0 ) ...

  6. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  7. 【数据结构初阶】八大排序算法+时空复杂度

    学会控制自己是人生的必修课 文章目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.直接选择排序 2.堆排序(已经建好堆的基础之上) 三.交换排序(Swap) 1.冒泡排序(大学牲最 ...

  8. 树与二叉树(二叉树前传、数据结构初阶、C语言)

    文章目录 前言 一.树的概念及结构 (一).树的概念 (二).树的相关概念 (三).树的表示 二.二叉树的概念及结构 (一).二叉树的概念 (二).满二叉树和完全二叉树 (三).二叉树的性质 (四). ...

  9. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)

    文章目录 栈的实现: 一.栈的概念和性质 二.栈的实现思路 三.栈的相关变量内存布局图 四.栈的初始化和销毁 五.栈的接口实现: 1.入栈 2.出栈 3.获取栈顶的数据 4.获取栈的元素个数 5.判断 ...

最新文章

  1. linux mysql 清空缓存吗_linux 缓存手动清除
  2. Python中的排序sorted(d.items(), key=lambda x: x[1])
  3. 吴恩达《Machine Learning》精炼笔记 10:异常检测
  4. Photoshop修复和合成梦幻人物
  5. 持续集成持续部署持续交付_自动持续开发和交付混合移动应用程序
  6. IOS6初始化后设置UIScrollview的位置
  7. python从入门到精通百度云-python从入门到精通视频教程百度云资源
  8. jquery可见性过滤选择器
  9. python、java、C三种方法打印乘法表
  10. 数据可视化大屏案例系列 3
  11. Mapper和dao
  12. Texpad for Mac v1.9.6 中文版 专业的LaTeX编辑器
  13. 如何将平板电脑/手机作为电脑的扩展屏(附带软件下载)
  14. HIT CS:APP 计算机系统大作业 《程序人生-Hello’s P2P》
  15. 学习Spherical Harmonics的简记
  16. Scala初级实践——统计手机耗费流量(1)
  17. 定义字符串的两种方式
  18. 班尼机器人维修方法_工业机器人常见故障和修理方法
  19. python 发送outlook邮件(html)格式需要避的坑
  20. projectManager

热门文章

  1. 数据科学分布——均匀分布
  2. PLS-00201: ORA-20000:
  3. sqoop导入时候显示ERROR
  4. 转 c#性能优化秘密
  5. 如何缩小gif动图的体积?怎样快速压缩gif动图?
  6. 拥抱AI,“纳德拉式”的微软复兴之路 | 人工智能观察
  7. 台式计算机搜不到无线,电脑搜不到5g频段wifi解决方法(图文)
  8. 【夏目鬼鬼分享】RabbitMQ路由模式
  9. 26.Nginx详解
  10. linux centos7 在线和离线安装字体