今天小编想要对刚学的链表和栈做个总结,让我们一起掀起链表神秘的面纱。
链表是一种数据结构,物理存储结构上非连续的存储结构,逻辑顺序通过链表的引用链接次序实现。链表可以用单向、双向、带头、非带头、循环、非循环组合描述,接下来我们以单链表为例,单链表的每个数据元素【数据域】后附加一个表示它后继元素存储信息【c语言叫指针域】【单向由此体现,只能根据其存储地址找到下一个元素地址,不能往回找】,这样构成的链表叫单链表,单链表有分为有头结点单链表与无结点单链表,如图1、2(小编第一次用电脑画的有点丑不要在意):

1处中val1头上写head只是为了表示val1这个元素与下一个元素地址next作为头结点,并没有像2处申请一个内存专门存放链表第一个元素的地址,故称无头,2处则为带头单链表。通过上面的图你可以发现单链表可以通过当前结点找到下一个结点,甚至可以从头找到尾,但是他有一个缺点是只能单向查找,即不能从当前结点往前查找,想知道咋解决的?我们先把单链表创建给学会说。
我们想要创建一个单链表,首先,想单链表是由什么组成的,一个一个的结点,那么这些结点通过什么来连接?结点中存储的下一个结点地址,再想我们如何查找遍历这个链表,这个时候就涉及到了,表头也就是头结点,为了实现一些处理数据有关操作在Java代码中我们可以一个链表看为一个类,结点作为内部类,链表既然是一种存储结构为数据而生,而我们阿猿在处理数据时,必须要和它的存储结构打交道,借存储结构实现处理数据的一些基本操作:增、删、改、查,这些操作被封装在不同的方法里,鉴于存储结构会常用到这些方法,为方便后续编写其它的存储结构,我可以这些方法于接口中声明,方便下次编写与后期维护。接下来以无头单链表为例,其接口定义如图:

链表组成部分节点定义如图:
在完成节点的定义和其接口的定义后,我们就需要具体实现接口中的函数,形成多个节点并链接节点成为链表,实现对这些节点的增添、查找、删除、修改,在实现完这些东西,它就成熟了,变成了真正的链表。为了让它长大,我们接下来需要继续分析,从它的一些最简单的功能开始吧。
1.打印链表,思路:打印链表得先找到头,然后挨个挨个打印吧,所以首先你要获得头节点,那么之后呢?打印过程中要遍历链表,头节点不可随意变动,所以得用同类型的引用变量存头节点的引用,之后在循环中一步步往后走,直到节点为null时停下,此时已经走完所有的节点。如图:

2.求链表长度,思路:遍历链表并计数。我们要遍历为了不用改变头节点的引用,用同类型的引用变量存其头节点的引用,只要此引用指向的地址内容不为空,计数器加加,直到其内容为空。如图:

3.判断链表是否包含某个值,思路:本质也是遍历链表,头结点的另一个引用随循环后移找到目标值返回true否则继续遍历,直到最后一个节点,还是没找到就返回false。如图:

4.清空节点,思路:头结点直接置空就好了。如图:

5.头插函数,思路:传入值创建新节点,把新节点的下一个引用指向头节点,移动头节点的引用到新节点,新节点继续作为头结点。如图:

6.尾插函数,思路:传入值创建新节点,判头节点引用 是否为空,若为空,此节点引用直接赋给头节点引用,作为第一个节点,返回。若头节点引用的下一个引用不为空,那么头节点的另一个引用2移动直到头节点引用的下一个引用为空,此时,把新生成的这个节点的引用给头节点引用2的下一个引用。有人就会好奇为什么循环条件是头节点引用2的下一个引用不为空?其实目的是要找到尾节点好插入,而尾节点的下一个为空,若把条件换为头节点引用2不为空,会跳到尾节点的下一个节点为空,新节点是可以放到这里,但前一个节点将无法与这个节点连接起来。如图:

7.根据输入值和下标插入的函数,思路:首先判断输入位置是否合法,合法之后若位置为0,则头插,位置等于链表长度则选择尾插,若位置都不满足上面条件,则利用根据位置找前一个节点的函数【其思路创造也是头节点引用2利用循环,循环条件是下标-1不为0,引用指向下一个节点的引用,直到找到目标位置的前一个节点返回此节点】。把新节点引用的next指向返回节点的引用的next【放在前防止返回节点的next被覆盖】之后再把返回节点的引用的next指向新节点即可。如图:

8.输入位置找值函数,思路:首先判断位置是否合法,合法后调用并传入位置找前一节点的函数,若能返回目标位置的前一节点,其返回值就为此节点的下一节点的值,如图:

9.删除一个值,思路:先判断表是否为空,若不为空,又判断传入值与头节点的值是否相同,若相同,把头节点的引用后移一个,返回即可,若不一样,则把值传入据值找前一个节点的函数【其思路为新建头节点的第二个引用,利用循环遍历停止条件是节点的next为空,若找到存此值的前一个节点则返回,否则继续往后走】得到存此值的前一个节点于是我们把前一个节点的next改为它的后一个节点的next即可。如图:

10.删除链表中与传入值相同的所有相同值,思路:新建头节点引用prev、第二个节点的引用cur,新建两个引用变量便于修改目标节点的前一个节点后一个节点。既然是要找所有值,那肯定需要循环遍历全表,循环条件为cur不为空,在循环中采用if-else语句,if判断条件是找到cur的值等于目标值后,把prev的next指向cur的next,并把cur指向其原本的下一个节点返回,如果没找到目标值,则prev和cur同时往后走一步,直到找到为止。如图:

在经过上面这些构造后,这个链表已经变成了一个成熟的链表,小编的解读就到这里,若有误,望指出,小编想进步了!感谢!!
2045

被折叠的 条评论
为什么被折叠?



