===================================================================
以下是我们本章单链表要实现的所有方法,后续实现顺序可能不会按图中顺序实现,但总体都是一样的。
头插法就是在单链表的头部位置插入一个节点。
思路:使用 Node 类创建一个新节点 node保存需要存储的数据,在头插之前先考虑两种情况:
- 链表为空的情况:
**head**节点指向的是**null**就代表链表使空的,此时只需要将 **head** 更改成**node**就行了。
- 链表不为空的情况:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520184204224.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MjcwNzUx,size_16,color_FFFFFF,t_70)
由假设图到效果图可以看到,只需要将**node**节点的指向改成当前**head**的地址,在由**head**更新成**node**即可达到最终效果
顾名思义,在链表的尾部添加一个节点。
思路:使用 Node 类创建一个新节点 node保存需要存储的数据,跟头插法一样,需要考虑链表是否为空
- 链表为空的情况:
**head**节点指向的是**null**就代表链表使空的,此时只需要将 **head** 更改成**node**就行了(这一步跟头插法一样)
- 链表不为空的情况:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520192048980.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MjcwNzUx,size_16,color_FFFFFF,t_70)
为了达到最终效果,我们需要定义一个临时节点**cur**从**head**节点开始遍历到链表最后的一个节点上,最后一个节点的指针域是指向**null**,所以 **cur.next != null**可以作为我们的循环条件,当**cur**指向最后一个节点时,需要将**cur.next**指向**node**就ok了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520200558413.png)
包含返回true,否则返回false
思路:定义一个cur节点从head节点开始,每次判断当前cur.data是否等于key,如果等于则代表包含,返回true,如果退出了循环后就代表不包含,返回false
注意:
- 如果想遍历完整个单链表,那么循环条件就是cur != null
- 如果只是想走到链表中的最后一个节点,循环条件就应该是cur.next != null
返回单链表的长度
思路:定义一个count计数器记录长度,定义一个cur节点遍历链表,每次循环count++ 一次,循环结束返回count
链表不像顺序表那样底层是数组实现的,在链表中是没有下标的,既然单链表没有下标,那我们就自己给链表加上 “下标”,当然这个下标是逻辑上的,在实际中并不能通过该 “下标” 来访问数据。
思路:在插入前需要按照数组下标考虑下标合法性,则有以下两种情况
- 不合法的情况:如果传进来的下标小于0或者大于当前链长度则是不合法的,需要提前结束当前方法。
- 合法的情况:进行插入,插入又分为以下3种情况
1. 头部插入:如果下标等于0,则调用的头插法进行插入。
2. 尾部插入:如果下标等于链表长度,则调用尾插法进行插入
3. 中间插入:如果下标在中间部分,创建一个**node**节点存储传进来的数据,然后定义一个**cur** 从**head**位置开始走,走到下标前一个节点,此时将**node.next** 指向为**cur.next**,再使**cur.next**指向**node**即可完成中间插入。
- 动图演示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520222557837.png)
删除第一次出现关键字为key的节点
思路:删除节点分为两种情况:
- 删除的节点是头节点:直接将head更新成head.next
- 删除的节点是头节点往后的节点:定义一个prev节点,prev从head节点开始遍历,找到要删除的节点前一个节点,随后定义一个del节点指向prev.next代表要删除的节点,最后使prev.next指向del.next即可完成删除节点操作。
- 动图演示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210521080837416.png)
删除所有值为key的节点
思路:定义一个prve节点从head节点开始记录当前没有重复的节点尾部,定义一个cur节点从head.next开始查找要删除的节点,在cur找删除的节点有两种情况,我们分别处理
- cur走到的节点不是要删除的节点 : 此时把prve更新成cur,cur继续往后走一步。
- cur走到的节点是要删除的节点 : 每次把prve.next指向cur,cur往后继续找删除的节点,以此类推知道循环结束。
- 动图演示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210521091338250.png)
以上循环结束后再处理头节点为要删除节点的情况,只需要将**head**指向改成**head.next**即可
将链表中每个元素输出到屏幕上
思路:定义一个cur从head节点开始循环遍历,每次循环输出对应的cur.data,直至cur为空循环结束
Jvm在回收内存的时候,当该对象没有人引用他的时候,这个对象才会被回收
思路:暴力将head指向为null即可
=================================================================
下面我给大家总结以下顺序表与链表的区别,有兴趣的不知道顺序表是什么的读者可以去看看我的上一篇博客链接: 顺序表
| 数据结构 | 优点 | 缺点 |
| — | — | — |
| 顺序表 | 支持通过下标随机访问 | 中间或前面部分插入删除时间复杂度为O(n),增容的代价比较大 |
| 链表 | 任意位置插入删除时间复杂度为O(1),没有增容问题,插入一个开辟一个空间。 | 以节点为单位,不支持随机访问 |
两种数据结构各有各的好处,以后只需灵活使用,问题就不大。
本章内容已经全部介绍完毕,希望能给你带来帮助,最后附上本章单链表源码。
// 单链表不循环不带头结点结构
class Node {
public int data;//数据域 存放数据
public Node next;//节点域(指针域) 存放下一个节点的地址
public Node(int data) {
this.data = data;
this.next = null;
}
}
//实现方法
public class MyLinkedList {
public Node head; //保存单链表头节点的引用
//头插法
public void addFirst(int data) {
Node node = new Node(data);
//假如第一次插入,直接赋值
if (this.head == null) {
this.head = node;
return;
}
//能走到这代表不是第一次插入
node.next = head;//node.next指向上一个头节点;
this.head = node;//头节点更新
}
//尾插法
public void addLast(int data) {
Node node = new Node(data);
//假如第一次插入,直接赋值
if (this.head == null) {
this.head = node;
return;
}
//走到这说明不是第一次插入
Node cur = this.head;
//先找到最后的节点
while (cur.next != null) {
cur = cur.next;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
Java高频面试专题合集解析:
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!
更多Java架构进阶资料展示
mg-oUHINwAY-1711015157130)]
Java高频面试专题合集解析:
[外链图片转存中…(img-D85hxan1-1711015157131)]
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!
[外链图片转存中…(img-od3vrjWg-1711015157131)]
更多Java架构进阶资料展示
[外链图片转存中…(img-iyZCnEPN-1711015157132)]
[外链图片转存中…(img-1qrmhsJI-1711015157132)]
[外链图片转存中…(img-V3Axzelw-1711015157133)]