00:00
怎么实现?好删除呢。我们先来说下这个思路,还是写到最上面。我们要删除一个节点。删除节点,好,同样我们先说思路。先说思路,再说代码。嗯,首先这个思路,咱们怎么去想这个事呢。呃,第一步,首先你要找到这个节点,但是同学们想找这个节点应该怎么找,打个比方。我们还以这个为例。还有一个规定,那么为了好看呢,我把这个给同学们拿到下面来,因为那边已经成了蜘蛛网了。好,我把这个地方呢。整一个新的啊,这样大家看起来呢,会轻松一点,三好,假如现在我们有这么一个链表。假如现在有这么一个链表。我们来思考一下删除应该怎么玩。首先这个头接点仍然这有个hide,它hide和hide是指向这里的。
01:06
好,我先问大家第一个问题,我先问大家第一个问题。就是我们在删除,删除的思路啊,思路第一个请同学想。害的肯定不能动。因为你一旦动了,那以后连便利都便利不出来了。这不能动,所以说害的呢,仍然不能,绝对不能动,害的不能动。不能动,这是第一个,第二个肯定要使用。要使用什么呢?Temp这个临时节点。这个临时的变量,那么这个变量有一个问题大家看,因为我是单链表,假如我们我们能能不能这样子这样思考啊,假如这有个temp。加入这个temp。哦,这个temp他假如我们上来以前让他只能害的,那么假如我们要删的是三号。假如啊,我们三十十三号请问。
02:01
我能不能让这个temp这样找,我让这个temp找到这个三,然后我说我要删掉这个。有机会吗?没有机会。如果你真的按这种思路啊,就是去找到让这个temp指向,如果让这个指向要删除的这个节点,那你就删不掉了。为什么删不掉?因为你没有办法找到它的前驱节点,因为我们是单线列表。这点是很关键的,一定要分析出来,因此,因为你你你如果寸步指向它。你想把这个店干掉,你是干不掉的。所以说我们这要注意,我们一定要找到。Temp,我们要找到找到temp的这个next的节点。以这个就是说我们要删除的,应该这样说,我们要删除的。我们要删除的应该。应该是temp的下一个节点。
03:02
下一个节点才能删除,那就意味着你在进行比较的时候,始终比较是temp next的那个no。这个大家能理解理解吗?就说这就意味着什么呢,急。及。我们在比较时,比较时。比较实。始终。始终比较的是。比较的是什么呢?Temp temp.next的这个节点的值。对。所以这就是为什么头节点在这就发挥了作用,如果你这个节,这个链表是没有头节点的,处理起来很麻烦。如果大家想,如果真的没有头节点,你上来就是第一个,那假设三个就是第一个怎么办?可麻烦了,这个事儿。同学们想,如果你真的给你们一个任务啊,就是弄一个没有头节点的面表,你上来就第一个要干掉他。
04:01
你想想有多麻烦。你干掉完了过后你得还得把那个first还得动一下。是不是?可这就是你要为什么做数据结构的时候,它有一种叫头节点的链表,为什么这么用呢?因为投机点我无关紧要对吧,我反正就是干这个活,我干什么活,我的作用就一件事情,就是来关联这这条链表。好,所以说我们这个思路有了啊,大家看能不能理解,好,如果没有问题的话,同学们,那下面的老师就来开始实现这个东西了。好,我们下午还要讲这个回溯这些啊,也非常好玩,但是呢,大家要认真的理解,好,那现在走代码其实是一件简单的事情,好,我把这个稍微的编一个这样的编号。那同学们,那现在的代码就写了,Delete。好,那你要删除的时候,你就给我一个编号就行了,你说你要删除哪个编号,我就干掉他。那同样根据刚才的分析,我们有个temp临时节点,还是要用的,这个临时节点呢,上来让它指向head,千万不要指向next啊,因为我刚才讲了,我们是要让碰的下一个今天跟你比较。
05:14
好,那就开始玩吧,那就Y循环了。呃,那同样我们还是。也也有可能找不到啊,这个问题是吧,也有可能没有这个人,所以你还得设计一个是不是是一个变量,按照我们刚才整条思路来做啊。我再说一遍,删除添加思路很多,这是韩老师的思路,你们只要能删除就行,明白好,我这仍然做一个变量,我假定没有。我假定没有好,我们这个边这个标志这个变量,这个标志变量。变量用于用于用于确定。确定是否有要删除的,要删除的这个节点你理解啊,那现在代码就比较简单,我循环还是跟刚才大同小异。
06:05
Or true?好的,那么那么这个处的时候呢,首先我们还是要做一个判断,如果你这个temp.next都已经等于空了,那就不要再玩了。是不是这个意思啊,你等于空就说已经已经到什么了,已经到最后一个你都不是了。你最后一个都不是,那你肯定不能再玩了嘛,那肯定那不能再玩了,所以说这个就直接break了,那break这个也不要去改flag,它就是没有。好,那还有一种可能性就是什么呢?注意题,好temp.next.no。它等于你这个no,这大家能理解吧。大家注意这方应该应该是等啊。这就说明找到了吧?说明找到了,那如果找到的话呢,我们把这个flag置为一个处。能理解,然后呢,我们也退出这个。
07:00
循环,还不要忘了这件事情,最后我们要做一个向下移动移位的操作啊,让指针temp下移后移啊,Temp后移一下。后羿。Very good,那整个这个Y循环结束了,过后呢,对我们就要来判断到底有还是没有,所以说我这个思路代码看起来呢好像较多,其实思路还很清晰,第一个就是这个任务就是。查找有没有。如果有。和没有再做下一步处理,那下面呢,我就不写注释了,如果这个flag。它等于真。那就说明什么呢?说明找到了吗,科三。可以删除了。那else?那L的话呢,同学们那就说没有,那就还是跟人家提示一句话嘛,对吧,你没有你总得说一下,就说删要删除的这个no等于这个的没有不存在。
08:00
本号D不存在,能理解,那不存在,那么咱们怎么怎么写呢?就写把这个写到这儿就行了,同样换行。诶,不能这样换行啊。谢恩。好,那如果要删除的话,我们来考虑怎么删除的问题了啊。好,我们还是打开这条线。假如。我们这个他我们要删除三号。假如我们删除掉三号啊,假如我们要删除的就它我标成另外一种不同的颜色。好,假如我要删除是三号,那这个时候temp在退出这个外循环的时候,Temp它是指实际上指向的是这里,这个能理解吧。好,现在你要删除它是不是很简单,只需要把这个next指向下一个节点就可以了。是吧,那当然有同学害怕了,说老师,假如这个要删除最后呢,一样的,如果你删除最后,我让这个temp指向下一个,指向它的next的一个,诶。
09:01
啊。我想想啊。不是指向下一个,是指向下一个的下一个。是不是应该是这样写的?他删除的这个动作应该是这样写temp。点next等于temp。第二。next.next。是这样吗?是不是样子,同学们?大家不敢说了是吧,我们再验证一下呗,验证一下呗,是吧,其实这个东西呢,你拿出一个图来比划一下就知道,比如说我们现在要删除删号,现在temp在这里,temple.next。等于temp.next它再next一下,不是它吗?那就是这条线就直接指到这里来了。好,是不是三号就被干掉了。那这条线是不是还存在的。这叫存在,你没有关系,因为这一条大家知道,在像在这个SC里面,垃圾回收机制仍然是沿用过Java的。
10:00
诶,我问大家一个问题,什么叫垃圾。是不是没有别人指向他,他才是垃圾,他指向别人没有用是不是?你说这个是不是个垃圾呢?四个垃圾,为什么?因为你指向别人,你指向别人没有用啊,你这个东西没有人再防到他了。但是这个不是垃圾,为什么呢?人家这个指向他了。好,这个没有问题,我们再看在做数据结构算法的时候,最可怕的是一定要测边界值,我提示一下话,啊,同学们一定要测。要测这个边界值。为什么叫侧边标最后和头,这是最关键的,因为有时候这头尾啊最容易出错。你们如果有点有那个测试的一个基础知识,就知道测试的时候他最喜欢测你的什么呢?比如你写了一个排序,或者写了个查找,他一般查找他查哪呢?他不查中间的,比如你你有个数组。他这一查,最前面和最后面,往往那个地方是最容易出错的。
11:03
所以我们要测,假如我们现在删除的是什么节点呢?假如四号节点,我们来看下这个对不对,因为这个地方是容易出问题的,好,我把这个呢,还改成我们这个符号,我假如我删除的是四号,我把它换成另外一种颜色啊同学们好,如果是四号的话,这个ten步应该是指向这里了,能理解吧。好,我们看这句话对不对。Ten步点next。等于temp.next。点那哎是不是它那刚好等于空啊,那是不是就意味着你这个地方就变成空了呀,是不是也是对的。是不是也是对的,所以说仍然是正确的,两种思路都是正确的,好同学们,那这个删除呢,我们就算是。完成了。好,同学们,我们来玩一把,看个删除能不能正确的使用,好吧。好,同学们,现在呢,老师来做一个测试。我们来测一下这个删除。不知道对不对,对不对。
12:02
好,我测试一下删除任务。测试删除,OK。嗯,那怎么删除呢?很简单,我们写个single.delete。对例我先删除一个不存在的,看看它有什么提示信息,然后我们打印一下。这个地方他应该报告我,呃,没有这个编号,并且按原先那个链表输出来执行。同学们可以看到这个信息,诶有问题了,哎,那那这个是什么问题啊。啊,同学们,这应该是输出的一个问题,是在这里吧。是在第几行啊,定位到72行。诶,72行no。No,这地方为什么错了呢?诶,这个怎么写成加号了啊呃,这这不对啊不对,好跑一个,再再来跑一个来走一个。
13:00
好,同学们可以看到现在他报告我们实不存在,而且按照原来的再输出一次是吧,我们现在删除一个存在的,我们上来呢,先干掉最后这一个,因为最容易出错的是先看一个中间的吧,中间的大家看到四号是中间的。先删除一个四号来走一个删除一个四号,我们发现呢,诶的确四号没有了,我们再删除一个二号,二号是边界。好,我们接着再删,删除一个二号,好再来玩一把。对,我发现呢,诶也是没有问题的,对吧,一个四号一个二号都是可以的。好,说明这段代码是没有什么问题,那么我们再删一个最前面的这个一,因为这个头啊也是非常容易出错的,删一个一吧。来走一个,看一下一号有没有被干掉。啊,没准什么时候就报一个控制针,没问题。没问题,好说明这个删除呢,的确OK,好同学们,那关于这个单链表的这个增删改查我们就说完了啊,说完了那现在呢,我们把这个代码给大家稍微的整理一下,我们讲了这么久一直没有啊。
14:14
去分析,那整个这段代码就是完成英雄人物的增删改查,我们就做完了,代码呢,实际上就是这么一大块儿。是吧,这么一大块儿来,我把它给同学们放到笔记里面来代码实现,包括我们整个这个分析呢,其实都在这儿都有。同学们也要善于去分析,好截取一段视频。
我来说两句