00:00
我们下面呢,给大家讲最后一个就是删除这个节点啊,删除就是把这个节点呢给删掉。那删掉这个节点呢?这个思路也非常简单哈,跟这个修改其实很像,唯一不一样就是说如果我们要把某一个节点删掉,比如说我要删掉这个节点。对吧,那我说首先要找到这个节点,找到这个节点以后呢,让这个节点被干掉,那我把这个思路简单的给大家捋一捋啊,捋一捋就说看起来代码很简单,但是呢,你要是不小心的话呢,也容易犯错误。好,比如说现在我这里有一个列表。OK,有一个列表。那现在这个链表呢,比如这这有一这这个第一个节点呢,它是一号,第二个节点呢,假设是四号,第三个节点假设是七号,我现在要删的这个节点是什么呢?比如说我要删除四号节点,打个比方啊,我要删除四号节点。
01:05
比如这个这个节点是我准备要删掉的,那你的思路应该怎么样,同学们?你的思路应该怎么样子?我们把它捋一捋啊,就是从单链表中删除。一个节点的思路,第一步是不是首先你仍然需要一个辅助的一个变量来帮我们找到这个节点?但是注意找节点是找到这个节点本身吗?比如说我要删除四号节点,我就找到四号节点。如果你这个辅助的这个变量找到四号这个节点,其实你删不了了。因为它是个单向链表,你想想如果我们有一个辅助变量指向了是你,你想想你怎么把它删掉。根本没办法,因为你不知道前面这个节点你找不到了,所以说你一定要找到待删除节点的前一个节点,然后把它删掉,因此这句话啊,就说我们先找到找到需要删除的这个节点的前一个节点。
02:19
Temp,也就是说我们这个temp啊,再说一遍,我们个temp,其实呢,它是指向待删除节点的前一个节点。好,当他把这个事情做完以后,下一步就比较简单了,下一步我们怎么做呢?其实非常简单,只需要让temp。temp.next等于temp.next.next就可以了,大家知道我在说什么吗?就说你的temp.next呢,要。Next它指向的是它的下一个,下一个,也就是说它指向谁呢?指向这个节点就可以了。
03:00
明白吧,那这个节点自然就访问不到,比如说我在便利的时候,我访问到一号节点,我就直接访问到七号节点了,那么四号节点呢,访问不到了,那四号节点大家想一想,因为四号这个节点呢,没有任何引用指向,它在Java中呢,就会成为一个垃圾,就会被JV就就会被垃圾回收机制回收,好我们把这句话再接收到啊,被删除的节点,被删除的节点将不会。不会。将不会有其他引用指向。指向会被什么呢?会被垃圾回啊,回收机制,垃圾回收。垃圾回收机制。拉垃圾。回收机制。垃圾回收机制。回收。是这意思吧,说大家看到这个思路很简单,那思路有了过后,下面我们就走一下代码好不好,走一下代码给他演示一下。
04:08
那刚才是添加这边是呃,修改我们再加一增加一个删除。删除节点。删除节点的代码,那现在开始写了啊,首先呢,刚才我们把这个思路已经给大家捋了一下啊,思路思路第一步呢是呃,Hide节点不能动。刚才已经说了啊,Hi。这个不能动,不能动。不能动,因此呢,因此。因此。啊,我们需要一个temp辅助节点。对吧,辅助节点找到找到待删除节点的,呃,前一个节点,前一个前前一个节点。好,这是这么一个思路,那么我这再强调一下啊,说明一下,呃,我们在比较的时候,在比较时。
05:09
是让temp.next。的。Na temp.next的这个no和谁呢?和这个需要删除的节点的no进行比较。明白的意思啊,好,下面这个写完了,我们自己写代码了,Public void delete,显然你给我传一个no进来,我就可以删。是不是拿到这个,那首先呢,我们先把这个辅助节点拿到hero no的no等于temp啊,我们就让它先指向hide。没问题吧,好,现在呢,我们仍然找一个flag。等于false这个变量标识是什么呢?它标识标识是否找到,找到这个带删除,删除节点的前一个节点,或者叫是否找到啊都可以,那下面呢,我们就while循环了处。
06:13
没问题吧?True,首先呢,我们先判断,如果temp.next它等于空了,说明什么问题?当temp.next等于空了。那说明现在呢,我们已经便利到最后这个的,就说temp.next它已经到最后了嘛,就是这个这个已经到最后了啊,已经到电表的电表的最后是不是那这个时候就必须退出了。退必须退出了,好,然后呢,我们继续往下走,如果我说如果啊,temp.next。点no,它等于你要算出no,注意次等号。同学们注意观察啊,刚才我已经讲过了,它是temp.next no和这个要删除节点的no进行比较,所以说你这一方不要忘了是不要写成temp补点no了,是ten补点next.no如果这个相同呢,就说明我们找到了,是不是找到。
07:14
找到了,待删除。待删除。节点的前一个节点谁呢?明白啊,Flag,我们就可以给它标识一下flag,那flag等于什么呢?就等于true表示找到了吗?然后这个时候就退出。对不对?好,那如果说这两个条件都不成立的话呢,我们要去实现一个便利所痛苦往下走一下,这个是后移。Temp后移,Temp后移才能实现这个便利,明白我意思吧,好,同学们,当我们退出这个while循环的时候呢,我们先要判断一下。If,如果flag,它等于真说明什么问题?
08:03
如果这个条件成立,说明找到是不是找到,找到是不是就可以删除了。可以删除,而删除的时候刚才老师已经分析了,是不是就是这句话。是不是就这一句话,就temp.next。对比这句话就搞定。是不点next等于ten,不点next.next。这句话不要写错了啊,否则,否则说明什么问题呢?说明我们没有找到这个待删除的节点,就说无法删除没有啊。就是要删除的这个这个节点不存在,因为找不到嘛。那这个时候呢,我们格式化一下。格式关系,同样我们也输出一个节点不存在啊,然后我们把这个no输出来就可以了。这就是删除的指令,那么我们试一下吧,同学们,我们来试一下。非常简单啊,同学们,那现在呢?呃,我们在这里删除一个节点。
09:04
删除一个或者两个都行啊,删除啊一个节点。那这样子我们就用single。点delete,我们删除哪一个呢?比如删除呃,这个节点的第一个,因为最容易出问题的是第一个和最后一个,如果代码写的不小心,可能是这有问题是吧,我撤删除第一个。哦,OK,删除一。把宋江删掉,删掉以后呢,我们再输出一下,看看到底有没有被删掉,好我们删除后,删除后列表的情况来运行值,我们看一下吧,同学们。对不看。原先是这个情况,现在删掉过后呢,同学们看,234仍然保持顺序的,宋江没有了,我们再删一个四号人物。好,我们我们多删几个,这样呢,能够看我们的代码到底有没有问题,是不是好,我写个四再保一把。
10:02
诶,同学们可以看到现在呢,四号也删除也没问题,我们再删一个。啊,我们干脆把它全部删光对吧,二。是不是再删一个删啊这个二先删一个,再再看一下啊,现在呢,142都删除了,现在其实只有一个人了。就是无用,我们再删,把无用也删掉,看看列表会不会空好吧。啊,就是他如果能提示链表为空了,那说明我们这个就没没毛病。好,同学们可以看到,哎,他说列表为空。这句话OK,好,同学们,那这个链表的删除呢,我们就给大家讲解到这里了,也就是说链表删除。也就讲完了,那同学们现在呢,我们回顾一下刚才讲解的单链表的增删改查。啊,查找我们讲的很简单啊,就是遍历一下就完了,如果要写出这个很简单,就是有没有有没有有嘛,就是用一个while循环去遍历,如果找到了返回,如果没有找到就返回一个空就行了。
11:03
好,那现在呢,我们把这个代码呢,给各位朋友整理一下我们刚才讲解的内容哈,来走一走。我们刚才讲的是什么呀?还有印象吗?我们讲的是链表。是不是电表啊,好,捋一捋链表。好,它是一个新的章节,所以说我先插入一个分页符。走一个。面表。表。那链表呢?我们怎么讲这个链表的呢?我们回忆一下,首先是不是先给同学们介绍了一下链表的基本概念。是样子的吧?Linked list就是链表,然后呢,我们先画了一个图。是吧,我们画了一个图说明了一下啊,列表呢,他在内存中存放的形式是这样一个。稀释,然后呢,针对这个图我们做了一个小结,还有印象吧,我们小结了上图。所以上面这个图呢,我们做了一个小结。小结的时候,我一共整理了有这么四句话。
12:04
是不是一句话,哎,说了说了哪个地方需要同学们注意呢,说的是链表呢,它是以它是链式存储。面试存储,它最大的特点就是链表的各个节点不一定是连续存储的,如这个图讲的很清楚。好,那么呃,链表呢,它有两种,一个是带头节点的链表,还有一种就是没有头节点的链表,那我们后面讲的是不是都是带头节点的。对吧,好,这个第一个我们就过了。那么这个讲完了以后呢,我们又说了一下单链表的一个逻辑的一个示意图。是不是逻辑示意图,它的逻辑示意图呢?呃,长的样子是这样子的,看起来啊,看起来好像是连续的,但我们刚才已经讲过了,这是一个逻辑图。啊,逻辑图是它通过这一个next的域连接起下一个节点,串起来了,就好像是一个羊肉串一样,一串是吧?为什么把它叫链表呢?就这样道理,这个讲完了以后呢,我们就给同学们讲了单链表的应用实例,说白了就是真三改茶。
13:17
是不是这个意思啊,就讲了增删改查。那我们怎么讲的呢?我们先给同学们讲了第一部分。就是创建还有添加,添加的时候呢,没有考虑顺序是这个意思吧,好,首先我们做的第一件事情是。这样的。啊,第一个我们是做了一个添加。啊,第二个呢,我们又讲了这种方式。就是按照它的标号来添加的,那现在呢,我们把这个代码啊,最终这个一一代码我们一起放过去,那么在添加英雄的时候,添加到尾部,我们是怎么来思考的呢?这是一个思路分析示意图,我给同学们截取到笔记中去。
14:04
好,我们回忆一下是在哪里写这个东西的,是不是在这啊?是不是在这给同学们分析了一下,我们它的一个单链表的添加,就是普通添加的一个示意图,包括下面的这个逻辑,好我把这段代码呢给同学们。分析到这里了。也就是说添加的时候呢,我们是按照这个思路来添加的,便利呢,是通过这个思路来便利的,明白我把这个图给同学们放到这里来。是吧,那么紧接着呢,我们又给同学们呃,做了第二种添加英雄的方式,这个时候我们考虑到排名了。是不是如果有这个排名怎么办,就是根据根据这个排名,根据排名来进行这个插入的啊,我们看看这里有没有有没有分析呢。诶也是有分析的,看到没有。哦,我把这个图呢,也给各位同学板书到我们的笔记中去,以后大家呢,再看我们笔记的时候,一目而了然,对吧,这边有一个分析示意图,就是思路的一个分析示意图。
15:11
给大家拿到这来。当我们把这个添加做完了之后,我们又讲了什么内容啊,还有印象吗?把这个挪到上面去啊,稍微小一点这个。OK,上面这个太大了,上面这个图太大了,调整一下。好,紧接着我们又给大家讲了一个修改,是不是修改这个节点。节点的这个这个这个代码实现修改节点的功能。功能。那么修改节点这个功能呢,我没有,我没有画专门的图,因为修改节点它的它的思路其实挺简单的,它的思路是这样子的,我也写到这啊的思路第一步第一步。啊,第一步先。先找到,这个时候可以直接直接找到这个节点,而不需要找到待删除节点的,呃,待修改节点前一个节点先找到该节点。
16:05
该节点通过什么呢?通过遍历就可以了,通过遍历然后第二步修改就行了,第二步然后找到以后呢,去通过这句话temp。Temp啊就就temp。点它的呃,Name等于你的新的这个hero node节点的name,还有呢,就是temp.link name等于新的这个hero node.linked name。是不是这个道理啊,就注意啊,这个修改呢,可以直接找到。直接找到这个要修改的节点,不需要找到它前一个,因为你是修改嘛,并不是删除,也不是添加,好这个讲完了,我们将讲了一个添加节点啊,到哪里呢?啊,我们不是删除,删除一个节点。
17:01
那么删除这个节点呢?我们这有一个思路分析的示意图,还还记得吧,分析示意图在哪里?就在这个地方。是不是这这这道图。里面呢,有老师整理的一个简单思路,第一步找到待删除节点的前一个节点,一定是找到前一个节点,不能找到它本身,找到它本身你删除不了了。然后呢,用这句话把它关起来,最后被删除,这个节点呢,将会被为作为一个垃圾被回收,就这么简单。好,我把这个示意。放到这里来,最后呢,我们把整体的这一部分代码给大家放到这里来啊,最后最终代码啊,这完整的给代码演示,那么完整代码演示呢,其实就是刚才老师在这个地方写的,我直接将其。插入到我们的笔记中去。好同学们,哪块不明白就把这个代码打开自己去看一看就OK了。好同学们,那关于单链表的增删改查我们就讲到这里,后面呢,我们为了加深印象,会给同学们讲解关于单链表的新浪、百度、腾讯的面试题,我们放在下一个章节为大家讲解。
我来说两句