线性表的链式存储之单链表问题

问题描述:链式存储实现线性表的基本操作,即实现单链表

涉及变量:Node:自定义结点类,构成链表的数据元素,分为数据域和指针域两个部分,数据域中存放线性表中的数据元素,指针域存放Node类变量,即下一个结点的地址

                 linkList:单链表类,由多个结点连接而成

                 head:此处指头指针,即指向头结点的指针,同样是Node类变量

                头结点:为数据域为空,指针域存放首结点的结点,指向首结点,一般将指向头

涉及教材:《数据结构——Java语言描述(第2版)》 清华大学出版社

 

单链表是通过指向后继结点的指针将一连串结点链接的存储表。

单链表相对顺序表而言更为灵活,适用于需要大量插入删除操作的存储表,但不便于查找

举个例子,同样是要查找下标为i的元素

在顺序表中我们可以随时通过ListElem[i]来获取想要的数据元素,而在单链表中只能通过从head结点开始逐个查找到i位置,才能获得该元素

可在进行插入删除时,顺序表需要进行大量数据的移动,而单链表只需要改变两个数据元素的next值即可

结点是构成一个链表最为重要的组成部分,数据元素存放在结点之中

结点由数据域和指针域两部分构成

其构造方法和成员代码如下:

由于屏幕问题底下还有一个}没有截到,见谅

其实若将两个成员变量设为public,则可以在外部直接调用,不需要多设get和set方法

但借用我们老师上课时说到的一个比喻

如果不用get和set方法,会有一种吃饭不经过喉咙直接放到胃里的感觉

我的理解是规范使用

想用我的变量,可以,按照我的方法来

即使在出现bug时尽量也要是我已知的设计好的bug界面

 

今天实现的全是带头结点的算法

基本操作为IList里的八种基本操作:置空,判空,求长度,陈列元素,增删改查

IList的接口是0113的写法

构造方法代码:

判空:若表为空,则头指针指向的头结点的指针域为空

置空:其实说法和顺序表的置空说法差不多,换个角度,我们是怎样判断空表的?头结点的指针域为空,那么若我们将头结点的指针域设为空,在判空时不就为空表了吗?

判空、置空代码:

求长度:单链表中的长度需要从首结点开始依次计算,指针p依次后移,循环条件为直到指针p为空为止

陈列元素:与求长度原理类似,在遍历过程中将元素依次输出即可

增:今天依旧是在第i个元素前插入数据元素,所以头插法是从1开始,也可自行更改为从0开始的插入方法

原理如下:

代码如下:

删:删除第i个数据元素,直接修改第i-1个元素的指针域即可

 改:将第i个元素更改为指定值,对第i个元素的数据域进行更改

查:按值查找和按位查找(此处依旧是第i个元素

顺便一提,通篇阅读下来,细心的朋友可能会发现,我使用的不是equals判等方法,而是用的==,我一开始使用的是equals方法,但在判定时出现了空指针错误,新手,也不明白是哪里出了错误,如果有大神能指点一下十分感谢

以上是关于单链表的基本操作的一些看法,希望对各位有所帮助

190114 Rewivy

 

posted @ 2019-01-14 21:16  Rewivy  阅读(291)  评论(0编辑  收藏  举报