链表学习关键点

来源:互联网 发布:多线程编程java 方法 编辑:程序博客网 时间:2024/06/05 16:53

粗略来看,整个数据结构就分成数组和链表两部分,这主要和计算机的存储有关系,因为计算机只能进行顺序存储和链式存储。由此容易得出链表的学习对数据结构的研究非常的重要,那么链表究竟好不好学呢,个人认为啊,不是特别好学,因为我学了好久好久。那么究竟是什么导致了学习链表的困难呢?我认为是老师没有讲解到位,书本上的讲解又过于复杂。学生嘛只要你认真去学,没有聪明与否之分的,不同的人学习的速度会有差异,但是只要方法对,学会一个东西只不过早点晚点的区别。

首先说一下我对数据结构与算法的理解,我认为数据结构是主要的,算法是次要的(绝大部分人认为相反)。为什么这么说呢,因为算法解决的是性能问题,并且任何算法都需要依附于一定的结构才有意义。说这个个人观点有什么意义呢,主要是希望大家把结构和算法分开看,不要混在一起。

下面讨论一下为什么要分开考虑,比方说数组,当你想起数组的时候你的脑海里就应该有这样的一幅图


只要脑海里有这样的一幅图一切就都好办了,严蔚敏版本的书上对每一种数据类型都给出了一个抽象数据的定义,如下图的样子



我认为这些是完全没有必要看的,为什么呢,有了数据结构,基本操作的函数常用的一般都是插入,删除,查找这样的几个,即便是真正写代码,也因人而异,函数原型的声明只要合理即可,因此呢完全没有必要把所有的基本操作都搞懂(因为有次看一个大学老师给学生讲课就是把链表的十几个操作全讲了一遍),当你对某个操作非常感兴趣的时候,随便百度一下就能找出很多非常简单的写法。

有了上面的铺垫呢,咱们来看一下链表,链表学习的最主要的特点是,看别人写的代码非常难看懂,自己写代码反而很简单。

链表必须学习的三个基本操作:头插,尾插,遍历。链表的其他操作使用的思想都是这三个中的一个或几个。

因此我认为链表只需要讲解头插,尾插,遍历三个操作就可以了,然后讲一下其他操作用到了这三个操作中的哪一个。如果这样学生是不是会感觉非常的轻松呢,总共就三个函数搞定链表,多轻松啊。

其实也没那么轻松的,看看为什么没有那么轻松,链表总共分为两大类,带头结点的链表和不带头结点的链表,因此啊就要求学生必须独立实现带头结点的头插和尾插,和不带头结点的头插和尾插,带头结点的遍历和不带头结点的遍历。在写这些操作的时候记住一定要画图,为什么要画图呢,主要是在脑海里建立一个链表的样子,这样做的目的主要是为了以后再写的时候脑子有图,就不需要每次都画了。另外画图主要是建立对链表结构的理解,上面说的插入和删除都是依附于链表这种结构的算法。

这里面最最有挑战性的就是遍历操作了,为什么这样说,因为通过遍历我们会看到结点的指针移动的方式(另外一篇《树学习关键点》里面我们会看到另外一种指针移动方式),链表里用的指针移动方式就是trv = trv->next这种赋值的方式。通过一个图来看一看指针移动:


看完上面的图,还有一点需要说明,就是在最开始学的时候不要画如下的图


虽然效果上完全一样,但是在给学生辅导的时候发现,使用这种图,学生思考trv->next的时候,思路总是跟着图中的那些’Z‘字曲线走,想着想着就迷糊了。


总结一下,

链表想学的简单,只需注意以上说的几点即可:

1,画图的时候不要使用带’Z‘字那样的图

2,刚学的时候画一步图,写一部代码

3,自己实现带头结点的和不带头结点的头插,尾插和遍历

4,搞清楚trv究竟指向哪里,是trv == NULL, 还是trv->next == NULL, 还是 trv->next->next == NULL

5,如果上面这些想起来都很轻松,那么恭喜你,你可以做别人的老师了




0 0