提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
以下是一个单链表的简单实现 将以图形和代码的形式进行描述
一、链表是什么?
1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。
2、结点包括两个部分:(1)存储数据元素的数据域(内存空间),(2)存储指向下一个结点地址的指针域。
3、相对于线性表顺序结构,操作复杂。
4.链表分为 (1)单链表 (2)双链表 (3)单向循环链表 (4)双向循环链表
二、构造步骤
1.创建一个功能类和一个测试类
2.功能类实现
创造一个节点 可以把结构体理解成以下这个样子
以下是代码实现 创造一个Node类节点 class Node{ public int date; public Node next; public Node(int date){ this.date = date; } }
1.构建一个简单的方法创建一个单链表
2.设计一个打印方法测试链表是否创建成功
此处创建一个cur节点 是为了避免头节点head发生变化,利用cur节点进行遍历
此处需要注意的是 while (cur!= null) 里面的判断条件 在这里如果判断条件是
cur.next != null 这样编写将会造成最后一个尾节点读取不到 因为此时读取到第四个节点
第四个节点的next为null 所以此时循环条件为false不进行 所以造成数据缺失
此时再测试类进行测试创造一个mainList1对象
3.头插 尾插方法的构建
尾插的判断条件 cur.next != null 此时cur读取到尾节点停止 所以进行尾插就是
把node赋给cur.next
4. 单链表长度
此处重点还是 while条件的判断 cur != nul 可以读取到最后一个节点
cur.next != null 读取不到最后一个节点 所以只要理解了这个条件的判断 就理解了单链表
5. 任意位置插入
分为三种情况 第一种插入位置为0 即是头插 第二种 插入位置为尾巴 即为尾插
第三种 任意位置插入 我们需要找到插入位置的前一个节点 因为前一个节点的next中
存储着下一个节点的位置 所以设计一个findIndexSub0ne方法 因为设计第一个数据节点为0下标
所以判断条件为index-1
此时我们还需要判断index的合法性 不能超出链表范围 并且构建一个异常类来抛出错误
由以下图我们可知如果读取到插入位置的下一个节点 我们将会找不到前一个节点
而如果我们去找前一个节点 前一个节点里存储着下一个节点的地址 这个时候就可
以解决这个问题 实现任意位置插入
6.实现删除第一次出现某一数据的节点
此时我们也需要去寻找key的前一个节点 所以我们设计一个searchPro方法
在这里我们可以用cur.next.val直接去读取cur的下一个节点的date值
这样就可以得到第一次出现某一需要删除数据的前一个节点
在进行remove方法时 如果头节点为null 则直接return 退出方法
如果头节点的date值为这一数据 则将头节点设置为下一节点 head=head.next
还有就是 通过searchPro方法得到了节点cur 则可以通过cur.next.next 完成操作
7.删除所有值为key的节点
总结
以上就是今天要讲的内容,本文仅仅简单介绍了单链表的一些方法的实现.