00:00
那么大家看一下,我这儿有一个说明啊,我们现在呢,使用带派的头,就是头节点的单向链表来实现一个水浒英雄的排行榜的管理。排行榜的管理,那么我们呢,完成对英雄人物的增删改查,当然还有查查询的啊,就是增删改查,比如说删除和修改,查找呢,同学们可以在这个基础上很快就能做出来,但是还有个显示啊,我们完成第一种方式,第一种方式我们不对这个英雄排序,就说来一个呢,就在队尾增加。要直接添加到链表的最尾,什么意思?就说假如我们有一些英雄,你要加一个英雄呢,我我我不从中间插入,我不从中间插入,我就往屁股后面扔啊,我们第一种方式来给家玩一下啊来呃,先把这个给大家板述到这里,我们现在就开始写了。好的,单链表的第一种方式,来吧。
01:01
单链表的第一个方式。找一个标题三。好的,然后呢,我们这个地方对案例的说明,案例的说明。好的同学们啊,这个很有用啊,跟上老师思路,如果哪个地方听得有点模模糊糊的感觉呢,对不对,那你就怎么办呢?就使劲儿的听一听就好了啊,使劲听就好一好,我们来完成第一个。好,那开始来做这个代码了啊,代码我直接上代码了,代码分析,因为前面的那个示意图,示意图呢,其实已经有了,它的示意图就这样子的,他的示意图就是这个这个图。我只是把这个节点呢,我把这个person改成另外一个名称叫hero。然后呢叫load,注意我们一般在这个开发的时候呢,一般这个呃,对应链表操作都叫什么什么load代表一个节点,那下面这个地方可能要做一个变化,也叫hero node。
02:00
Here no,那既然是一个no的节点呢,因为到时要排序,就是对他的那个,比如说这是梁山好汉第一条对吧,宋江同学,第二条卢俊玉同学,那我应该再给他来一个编号。啊,他的排名,比如说叫做什么呢?叫做称好,然后呢,再给他来一个名字,除了除了名字之外呢,他还有一个昵称。对吧,比如说宋江同学,呃,他的昵称就是及时雨,对不对,及时雨很及时的给你下了一场雨。好的好,同学们,那也就说到时间这个地方,每一个呢,这个地方就应该换成对应的,就换成什什么玩意儿了,就换成这个hero hero not,同样这边也是一个道理啊,这个也是一个道理,Hero no。Here load,好,这个呢,也是一样的,Here load。Hero not。好,这边也是。好啊,最后这个呢,应该它是空了,但是类型还是hero no。
03:03
好了,同学们,现在呢,我们来打开我们的base code,先来完成对这个它的增删改查。好,现在呢,我们新建一个文件夹叫做链表,链表呢。好链表我们就link吧,Link好吧,Link啊,然后呢,DEMODEMO。并可正常改查。我们叫单链表的啊,比较单链表的叫single单的link啊。好,那现在呢,我们来写一个文件。OK may.go开始。注意听啊,这个我想我是要求你们同学们都背下来的啊,这个是必须,就是你听完这个课过后,你必须要达到一个什么呢,能够把它就是在脑海里面形成这个这个列表的感觉啊,他可以完成很多事情。来吧,走卖,首先我们先来定义这个英雄节点,因为你操作的时候,你不是就就这些节点性操作吗?那你肯定先得把这个节点给我定义出来,好节点呢,咱们推一个来把它复制过来。
04:08
OK,先定义。定义一个hero hero no啊,Hero no非常的简单,OK,把这稍微整理一下。好OK啊,这个地方就是type node类型啊,这些都有了啊,都有了,好这个没问题,保存一下。翻过来不会有乱码吧?No name我都小写了啊。好,这个地方稍微的整理一下。好,没问题。每个含义要搞清楚,这个是它的信息,这个是代表指向下一个节点。这个表示,这个表示指向指向下一个节点。叫下一个英雄,这样才能形成一个链表嘛,手牵手,他们是好朋友啊,那么现在呢,我们来写一个,呃,Function。
05:00
主方法。那么总方法先搁这,我们现在呢,要对它进行各种操作增删改查,那么我们来看看这个怎么写啊,我看直接写个函数还是呃给他绑定,这个都无所谓啊,我看我以前是怎么设计的,应该是直接写个函数,那就直接写函数吧啊,反正这个你给他绑定,我待会用的时候还还要把那个Z写上,比较麻烦,好先看第一个方法。我们先来做一个演示。嗯,先缓一下吧,先做一个初始化,先第一步。第一步啊。第一步,先创建。创建一个头节点,先创建一个头节点,这个头节点呢,刚开始就得有,就你不管怎么样,这个头节点你先把它整出来啊,先把这个头节点整出来,那么头节点呢,我们就这样写了,叫害。Had,然后等于什么呢?好艾不,然后呢,有个hero node。
06:00
Here no来这里面这个这里面的东西都可以不要,它就是一个空的,他啥都没有,就是一个空的,所以说里面根本不用给他复制,只是它这里面都是默认值啊,头节点不需要给值,就采用默值,先采用默认啊。好,有了这个东西,那么现在呢,我们就要往里面加东西了,看一个案例怎么加,第二步,创建一个新的节点,新的hero节点。Hero。那么这个地方有可能是你从这个键盘输入的,比如说你输入,哎,请你请你输入一个新的什么英雄的名字啊编号这个我们不写了,那个太费时间了,我就直接构建,我就直接构建,比如写个六。啊,别人叫HERO1 hero1,然后呢,它等于什么呢?直接来一个啊来走一个。然后呢,这里面的值咱们就可以给他了,比如说这个第一个人的编号是什么呢?一号,一号英雄,一号英雄的名字,比如说叫做宋江。
07:05
宋江同学好,他的昵称link name。Le呢?好,他的昵称叫及时雨。银时。与好的,那么它的下一个节点是多少呢?这个没法定义。这个它的下一个节点到底指向谁,要在链表里面去确定,所以说呢,这个地方我们先空着,现在开始写一个东西了,让它连起来好关什么呢,向。注意听给添加节点给链表。给链表注意听啊,链表增加或者说插入插入一个节点。那么这个时候你怎么把它插进去呢?非常的简单,你必须先要告诉我这个头几点是谁,也就是说我先它的它的基本实项是这样子的,找到投几点,啪啪啪啪找,找到一个适当的位置把它插进去。
08:01
那么添加的时候呢,我们先用第一种最简单方法找到屁股后边添加好,我们先写第一种添加方式,编写第一种添加方式。啊,编写第一种,第一种插入方式,插入方式什么方式呢?就是找到最后在这个链表的,在这个单链表。单链表的最后加入。这个最后加入,其实大家应该想象就有点儿像一个队列。有点像个对,大家知道我们对立的时候呢,是劈口面价的,大家还记不记得我们刚才用那个,我们用那个数组来实现这个对列还是挺麻烦的,但是如果用链表来实队列,你会觉得非常轻松啊,也就是说这个讲完了过后呢,我把真三改查讲完了过后,我要给你布置一个任务,就是用链表来实现队列。哎,这个大家应该都可以写出来的。好,那么我们来看一看,那就insert了,Function function insert一个hero node啊,我们过去就叫这个名字,那你要给我往里面添加,你必须首先告诉我你的头接点在哪,你如果投进点不给我,我是搞不定的。
09:13
啊,我找不到,所以说投进点是个至关重要的点,没有投机点一切玩完,甚至投机进点,如果一旦丢失,你整条链表都没有用了,说投进点不能乱动。你这个头衔是只要乱动了就麻烦啊麻烦,那么它呢,就是一个hero node。好,那你既然给了头节点,你还得给我一个新节点,就说现在呢。我们我们现在可以想象,这些节点现在都还没有啊,我先把它放过去。我先把它放过去,就现在先不去想这个节点这个问题,这中间这个现象我就先暂时不要了啊,要不这样子也行。把它先保留在这儿,我们先来把这个新的做一个新新的这个链表,大家看一下下怎么过来的。好,现在现在目前啊,同学们注意听,现在在我们的内存里边呢,已可以想象已经有一个偷节点了,就说一旦22行这个被执行了,你应该可以想象在这边有个头节点产生了,头节点它指向哪里呢?在你的脑海里面,你应该这样去想,也就是说目前在我们的内存里面已经拥有了这么一个东西。
10:22
这个头节点指向了一个,呃,这个head指向那个,这个头节点应该是有的。好,现在呢,我们又创建了一个新的这个东西叫hero,一是宋江,我们准备把它加进去。宋江呢,现在已经也创建好了,他长的样子就这样子的。他长的样子就这样子的。好,宋江,这个节点现在有了哦,我就写个简写的啊。简写的,他的名字叫宋江。叫宋江。诶,宋江,那么宋江呢,现在要想办法跟他关联起来,就是我要把这个节点连到这个投递点去,大家看我怎么做。
11:06
啊,大家看我怎么做,干脆这个换一个这个地方吧,换一个还换这个颜色好看啊。那么为了跟头几的饮食区别,咱们换成这个颜色,现在已经有一个宋江了。有个宋江了,他们之间呢,还没有关联起来,就是他是他,他是他,OK,现在这个头颈呢,怎么关联起来呢?好,你把这个给我。给我一个新的英雄节点,你给我行啊。Hero node,好,你给我现在在这个函数里边已经拥有了头节点,核心节点,现在我们是直接在链表最后加入,怎么加入呢?思路这样子的。先找到,先定位。先找到这个节点,就是链表的最后尾最后那个节点,先找到链表,该链表该链表的最后这个节点。
12:07
说老师这个最后节点不就是头节点吗?不一定,因为你现在你现在第一次嘛,你刚好看到就是头节点,但是加个宋江,再加独军营,那最后这个节点就是宋江了,所以说你还得想办法找,怎么找呢?问题是怎么找到这个最后这个节点呢?思路头节点不能动。头几点不能动,所以说我们先来搞一个这个跑堂的啊,我喜欢把它叫做我喜欢把它叫做跑龙套的啊,我们先让这个给一个辅助节点,就创建一个辅助节点。辅助界,这个辅助节点干什么的呢?它就是跑龙套的。他为什么跑龙套呢?那他帮我们做了很多工作来跑龙套。跑龙套。哎,跑龙套他帮忙的,说白了他就帮忙的,哎,他是帮忙的帮忙,那他怎么帮忙呢?看我让这个跑龙套名师就要探步,它是个临时节点,让它指向这个hero head。
13:13
那也就说到时间这个碰布呢,它就指向亥了。那这个hi有什么用呢?我让这个哦,这个temp步有什么用呢?我让这个temp步找找找找,把它定位到最后,看我这一段代码来了,For循环。我先把这个temp定位到最后链表的最后这个这个地方去怎么做呢,如果。Temp破。点next等于near。各位同学想一想。如果这个条件成立,那就意味着temp已经到这条链表的最后了。为什么这么说?因为只有最后这个节点的next才是。这个我们列表到最后,你比如说目前你看目前你刚刚上来,假设按照你的方法说,现在你有一个痛老追听。
14:06
你现在有个称呼了啊。你有一个temp这个节点呢?没错,你有temp这个节点,这个temp节点,你不是让temp指向hide吗?你hide指向谁,我也指向谁。这个是大家肯定能够认同的,因为他们都是引用,所以他们指向同一个地方,这是没问题的。好,现在呢,我一判断他步下一个等于什么,你现在这地方肯定是个空,因为你刚开始建的头顶啥都没有,所以它是个逆。他是那个哦哦,我一看哦。你这个temp就最后,然后我就让这个temp。把它关联起来,就是我让这个hide的这个地方指向宋江。怎么做?非常简单,如果这个这个成立,就表示啊,表示找到找到最后了。找到最后我就不要再找了,Break。那break出来过后,有一个动作必须重要啊,你这个地方你走了狗屎运呢,他不看好。第一个是。
15:07
第一个就是等于next,但是你你不敢不敢保证下一次是啊,所以说这有个非常重要的工作。这个大家看看能不能绕过来。就是你得让这个臀步不停的往下走。因为你现在是第一次嘛,你你第一个是刚好找到了,但是将来假设是这个情况,你看。假设这个情况它不是向这的,第一个不是不是空,第二个不是空,你你要去看它下一个是空,你的ten不得往下走吗。你看假设你你你的列表已经有有三个元素了,你让temp步指向它,肯定第一个不是空嘛,然后你往下走一下,判断它不会会不会空,然后再往下走一下,判断它会空,再往下走一下,诶这个才是最后,所以说你这个移动,刚才老师的这个票移动的这个动作就体现在这儿,让什么呢?让temp,让这个temp不断的不断的。
16:04
不断。不断的指向,指向下一个节点。好,那么等到它出来的时候,大家可以肯定的是,当它退出这个负循环的时候,Temp一定是指向了该链表的最后节点,这个不用怀疑了,好,现在第三步加入。你现在已经工作做完了吗?将谁将这个new hero加入到最尾?加入加入到什么呀?链表的表的最后O了,怎么加进去呢?非常的简单,大家看你要把它加进去,就是一句话,你让这个temp的下一个节点指向它就可以了。那也就是说你的动作只要这做这么一个动作就行,temp.next等于new。Hero完事。好这个动作非常重要啊,所以说今天呢,如果你自己去写,你你会出现很多这样的错误,什么什么空子空指针的错误,好这个就像连上了。
17:08
连上了啊,那就说这句话就等价于什么意思呢?我让这个temp的next指向hero,相当于说这个地方就不再是near了。她指向了。宋江。那这个时候大家可以看到,我们这个头节点还是头节点,但是他已经指向宋江了,那么大家可以想象到,如果我们再来一个用户,假设我又加了一个叫卢俊义的人,我们看这个逻辑是不是也能走通。又来一个卢俊义啊,卢俊义。又又传进去,好,这个是小卢。小卢,小卢刚上来。小小卢啊小卢。卢俊义卢俊义。好,卢金月,嗯,我问大家一个问题啊,同学们,宋江刚刚加进去的时候,他这个节点是不是也是near?
18:05
因为你没有动过它,它默认就是逆耳,这个没问题,所以说你第一次加Y瞬间过后,它这个情况好,卢俊又来了,卢俊玉刚刚出来的时候,它的下一个节点这个值其实也是那尔。现在大家看来了啊,根据我刚才逻辑进来害的给了卢俊义,也给了,现在让臀部指向害的。好,Temp步指向开了,过后我开始定位这个temp的下一个是不是空眼,Temp步下一个是不是空的,不是空的,于是temp步往这边移动一下。直到这儿。TEMP1,因为他next又宋江嘛,他一看,哎,宋江下一个是不空,已经是空了,宋江就最后一个,宋江是最后一个,我就退出来,然后呢,让temp的next指向卢俊义,好,这个地方呢,又。让宋江的这方指向卢俊义了,指完了过后,你看卢俊义也加入到我们这个大家庭,大家欢迎对吧,加入到我们,但是卢俊义呢,他的next还是空,所以说下一个再加的时候,就在卢俊义屁股后面讲,以此类推,好这个逻辑大家要非常清晰啊,不然的话到时候出问题,好,同学们,现在呢,我们来玩一把。
19:14
好,这个加进去,我们来做一个显示,现在呢,我们来把这个呃,整个链表给它显示出来,大家想想怎么显示啊,来显示列链表的,注意听啊,链表的所有节点信息。这个对我来说没有没有没有难度,有没有难度呢?没有没有难度,Bank我就叫list,一般叫list link。List link啊,比如说我们叫list single。单列表。啊,或者叫这样写也行,就直接叫list he节点也行啊,根据我这叫这个节点也是没问题的,那家大家想一想,我们要去显示一个链表,所有节点信息必须要知道的是什么?必须要知道的还是一个可爱的头节点,没有头节点,还是那句话,啥都干不了,真三改啥全部没,没法玩。
20:06
这他改造全部说这个头节点是特别重要的,因此这个头节点你要给我,你不给我头节点我玩不转。所以你看这个头节点特别的重要,给他了啊,我给你了,来吧,你搞一下,注意头节点不能动。头你不要这样说,诶诶韩老师这个头节点这个不是已经有了吗?我我动它一下,你不要动它,因为这个头节点不能轻易动的好,所以说我们还是要做一个跑堂的来跑路的再次出现。那我的思路干什么呢?我先又创建一个辅助节点,还是跑龙头帮忙,那这个时候呢,Temp也是向投机点,现在我就开始便利。那便利怎么便利呢,便利便利这个。链表那大想一想啊。这个便利绝对不能用这种for循环,就是不能用这个什么I等于多少,这个不能这样用,因为你不知道有多大,所以说我们直接用这个for循环。
21:04
开始了。上来过后。我们可以这样做,就是如果我们先判断它是不是已经是个空间点了。我现在写,如果temp。点next。等于near。它就等于一个逆,说明什么问题,说明它已经空了,就是已经到最后这个节点了。对吧,他他已经到最后这个节点了,大家应该可以想象,就他已经到最后这个节点了,呃,那到最后这个节点呢,呃,我们。我们这样子吧,我们这样子做吧。我我我换一个这个显示的方法,很多同学们很多,我我用一个我自己认为比较好的方法,我这样写,我先不做这判断,我先判断你是不是空空链表。我先第一句话啊。呃,你看我我的思路啊,你看我的思路这样好不好,我觉得这个方法不错啊,先判断。
22:03
先判断,注意听,先判断该链表,该链表是不是一个空的链表。这个对我来说很容易。如果temp。点next就等于一个near,好的,不用说,这就是一个空间表,因为你上来过后。他啥都没有,就是个hide hide就相当hi,就那就是空,肯定是空间表不玩了,直接输出一句话,我们马上可以撤了,啊,把这个写完我们就可以撤。那么这个呢,我们说是空链表无法显示,链表是空的。啊,就直接说空列表空。空。如也。啊,那这还不说空空如也,OK,这个列表是空的,没法玩。没法玩,那如果说是空的话,就别走了,赶紧回去,不然的话下面是很危险的,对不对,因为下面有可能会控制在日线,好如果这种不为空,那就好办了,那我就上来过后,相当于我用了一个舌do外的循环。
23:14
度二式一定会有一个显示,我上来给我先显示一个,再往下走一下,哎,这个时候就很清晰了,因为你只要不是空的,那就意味至少有一个节点,这个大家必须想明白。因为你不是空的,那肯定至少有一个节点,所以说我上来给我先显示这个点,那就写了啊format。PRPRT不。我就写一下啊,我们说节点信息如下。好,我这样写。节点的信息我就这样写啊,第一个把他的呃,把他的ID给取出来,他的他的他的那个ID啊,然后呢,呃,打一个逗号啊,打一个逗号,把他的这个昵名字取出来好,再把他的什么呢,再把他的这个昵昵称取出来,好,还有他一个地址,他有一个地址啊,地址呢,我们就直接用这个指向这个地址,我就不打了,但你要打的算也可以,我就直接表示它指向了谁啊这样子。
24:12
看起来比较舒服一点啊,这样子看起来舒服一点。就感觉它是指向下一个,那指向下一个呢,我就开始写了,I在哪里。爱在哪儿?为你temp你temp下一个呀,所以说你temp temp的下一个不是,那你那你干什么呢?你就直接让这个temp可以往前面,就是说现在temp的下一个我们是可以打出来的,所以说。可以这么干。走。Temp。对,Temp,它的下一个这个节点。这个就是它的下一个节点对吧,就是next,就是它下一不等于空嘛,下一个节点呢,我们这个取出来其实就是一个hero是吧,它这个X的其实就是个hero,这个时候呢,我们就可以把它的这个no取出来了,大家看不能不能理解,因为tenx就是其实就是那个它的下一个节点,所以说把no打出来。
25:12
好,紧接着其他以此类推。一推推啊,各位朋友,我就直接用特步来走了,然后他的名字name。对的,然后呢,他还有一个什么玩意儿呢,他还有一个昵称Li。好,为了好看呢,我这儿换一行。好好换,换一换,那么整个做完了以后,整个这个打了一次过后,他就去判断,现在是不是已经到最尾了,判断一下,这时候马上判断。判断是否。到最尾了,是否那个是否对,这个叫链表尾了,链表最后链表后了,那这样子很简单,如果你这个temp。就是啊,对这样做啊,是说错了啊,这个时候他打完了过后,打完了过后,我们让这个臀部往下面走一下。
26:05
Temp等于temp.next。好,我做一个判断,如果temp。点next。Next,如果它等于near。说明。这是最后一个了,就这个最后这个一个你而且你还已经打过了,对吧,你上来过先把他,你是提前先把人家下一个打了嘛,你是提前先打了一下,然后你再去往往那边走一下,对不对?好那么你现在相当于说先把下一个打完了,过后你再去判断你这个是不是已经是空了,对吧,看看这个逻辑是不是先上来先把这个下一个打了,打了过后我想下面走一下啊,走一下过后呢,看看你是不是空啊,如果为空我就不玩了,好,这个就是直接就break。Break就完事了,好这个代码就写完了,好这个代码呢就写完了,大家看能不能理解。
27:01
好,那我们先来玩一把,看看他能出出结果没有啊。好,我们现在呢,把这个hero写到这儿来,我们玩一把。好,有一个英雄,我们先打一下,一个英雄能不能打出来。好,先加入。来测试啊,加入。怎么加入呢?非常简单,就是调用我刚才的这个insert load。Insert,非常简单,走,把你的这个头节点给我吧。再把你的这个新节点也给我吧。好,我来输出,我来输出,输出这个这个list hero nose,我把头节点给你,这个叫显示。啊,这叫显示,显示的时候呢,把投几点给我。Hide,给我好就可以了。那我们来执行一下,看看代码有什么问题没有,好这边有点小问题。
28:02
好的,它是format format单词fmt。好,然后呢,上面是不是没有引呢?好引了来玩一把啊,同学们看,如果这地方有问题的,一定会给你报一个panic panicle来走CD点点CD到我们的这个single。链表go run,命点go跑。好的,各位同学,大家可以看到只有一个人,一号宋江及时雨后面在此没人了。没人了,那么我们只有一个用户是看不出来这个好坏的,我们再加几个。再加啊,我现在在构建一个二号人物啊,二号人物呢,假设他是卢俊义。卢。俊逸没问题,如今玉呢,号称对号称这个玉麒麟。玉麒麟,OK,那么我把二号呢也加进去,怎么加进去非常简单,把这个往这一加就O了,相当于说在我这个链表里面呢,我拥有了两个节点。
29:12
两个节点,一个是宋江,一个是卢俊义,而且呢,我在添加的时候没有考虑顺序,就是按顺序加的,那宋江在前面,卢俊义在后面,相当于是一个链表的一个队列,好大家看能不能打印出来。好,我们看效果。我们可以看到,我们可以看到。我们可以看到什么呀,他没出来啊,大家可以看到,在这里说有一个宋江,他下一个节点是卢俊义,卢俊义下面就没人了。没人了,好,呃,这个呢,第一个非常简单的案例就给大家讲完了啊,就说我们讲了个什么呢,讲了一个就讲了一个。添加还有一个显示,但是其他我还没有写,对不对,好,没有写,那这样子,关于第一个小案例,就是我们所说的这个单链表的一个显示和添加,先给大家介绍到这里。
30:04
我们休息。
我来说两句