名词辨析:指针
1.什么是指针,想必大家都不陌生,但是,在这部分的知识中,包含着一类特殊的指针,表面上它只是单个的数字,但它其实代表了作为栈或者队列载体的数组的下标,在实际题目中数组的第一个与最后一个元素的下标可能是不断变化的,所以需要两个数字来记录其位置让我们可以快速找到我们的目标数据。
名词辨析:栈
1.想必各位小伙伴都知道,我们的计算机的组成部分有栈,堆等,但是此栈非彼栈,数据结构中使用的栈,是一种程序员定义的数据存储方式,它的存储方式类似与计算机中的栈,先进后出,在理解的时候可以将栈理解为一口井,存储数据就是将数据扔到井里,取出数据就是将数据从井里捞出来,顺序就便于理解了
时空复杂度
1.时间复杂度就是一段代码的时间成本,而判断背景是当数组,循环无限大时,所以,固定次数的循环或其他代码步骤直接默认为1,而递归类计算需要列式,因为可能用到复杂的数学公式。
2.空间复杂度就是一段代码的空间成本,即额外占用的函数栈帧,判断的重点在于判断递归调用的次数
3.相加相乘原则:任何相加或者相乘得到的结果,数字直接省略(除了没有循环的情况,直接为1)
4.表示形式:O(时空复杂度)
顺序表与链表
1.顺序表是数组的别名,存储在物理空间是连续的
2.链表是一组结构体,存储的物理空间是不连续的
3.二者的优劣:
顺序表和链表的存储方式,可以作为栈和队列的不同实现形式,而二者的实现需要程序员根据题目的不同情况进行选择。
重要的初始化函数malloc
1.首先介绍一下malloc函数的使用方式:动态内存管理-CSDN博客
2.在该部分的内容中,数组以及结构体都使用指针代替,而在初始化中必须使用malloc函数对指针进行初始化以避免野指针,在以指针作为数据成员时,要主动辨析初始化时是使用malloc函数还是赋NULL,同理,使用malloc可以不free,一般不报错(尽量使用使代码严谨),但是只要使用free释放一个指针后必须在下一步将指针重新赋值或者赋NULL,否则会造成内存泄漏
单链表
1.首先先熟悉一下单链表的操作:
单链表前插-CSDN博客
单链表的尾插-CSDN博客
单链表的尾插(一级指针尾插的缺陷及改进)-CSDN博客
单链表的删除-CSDN博客
2.单链表的难点:二级结构体指针与一级结构体指针的选择。二级指针在于是否需要改变一级结构体的指针且该指针不是结构体的成员,而一级指针最为常用,一般用于修改结构体的内部成员。
3.单链表的本质:一组可以按顺序找到的结构体,存有一组特定的数据
栈与队列
1.栈是一种数据存储形式,遵循先进后出的原则,队列也是一种数据存储模式,遵循先进先出的原则
2.先来熟悉一下格式栈的基本知识-CSDN博客
队列的基本知识-CSDN博客
刷题经验总结
1.特殊情况:
1.空与满:空时不能删,满时不能放,其中要区分空与未初始化
2.前后对称纠错法:也就是顺序问题,在题目中我们经常会遇到修改某表块时要同时改前面的表块再改后面的表块,所以当我们凭借肌肉记忆写出改表代码时,我们很可能会遇到把前面改了结果找不到后面指针的情况,此时应快速浏览代码,观察某式的左值是否出现了两次,出现则需细细甄别
3.为什么不动?在修改表块时总能出现这个问题,解决方法为使用二级指针识别一级指针的地址,一般用于头指针与头删头插,尾指针与尾插尾删
4.开头赋值:当你不想改变头指针位置但又想改表时,会自己创建指针进行运算,而此时赋值不能直接在代码一开始赋值,必须在循环开始改表开始时进行赋值操作,否则会出现空指针问题
2.特殊方法
1.尾插比较法:用于两个链表,两个指针,每次比较后将大或小的一项对新链表进行尾插,在两个链表的其中一个结束时循环结束,将剩余链表直接接在新链表的后面
2.快慢指针法:首先当快指针一次两步,慢指针一次一步时,相遇就会说明遇到了环形链表,其次可以返回任意倒数的表块,但使用时需要进行判空和讨论
3.带头和双向的链表:带头也就是哨兵位,它的好处是不会改变头指针的位置,无需使用二级指针,而双向链表的好处是可以前后互相寻找
4.环形链表:一般用于约瑟夫问题,循环删除,当表块的next为自身时循环结束
5.顺序表和链表的选择:在栈和队列中,我们会遇到选择顺序表还是单链表的问题,而二者的主要差距在于顺序表可以轻松通过“指针”来找到任意位置的数据,且可以与字符,字符串相关联,而链表的好处在于可以进行灵活的内部操作,且当使用队列与栈相互表示时采用单链表可以使读者拥有更好的逻辑关系,在双队列双栈的转化时可以更加自如