什么是链表(Java)

都2020年了,到底什么是链表?

在这里插入图片描述

前言

(本文适合没有基础的小白,或者想了解学习方法的入门者食用 ps:本文所指的是单向链表)
还记得上《数据结构与算法》这门课的时候,老师在前面讲:链表有一个数值域,一个指针域,数值域用来存放内容,指针域用来指向下一个node,然后什么链表相对于数组的优缺点等等等等,balabalabala一堆。依稀还记得老师用心良苦的用ppt动画展示,链表是怎么断开节点,然后插入数据的(回想到这里不禁感慨时间飞逝-手动狗头)。但我总是感觉我跟老师讲的东西似乎是在2个平行世界,我就好像一个旁观者,任凭老师balabala,我就是听不见进去,可能是因为我太菜了吧,感觉旁边的同学似乎都都听懂了(手动笑哭)。

链表的定义(外貌)


 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }

是的,没错,直到昨天我才第一次直观的认识到什么是链表(也跟平常没咋用过有关吧),原来就是这么一段简洁的代码,原来链表是一种需要自己先定义再使用的类,原来所谓的数值域,指针域就是这么个情况啊。事情的起因是我在有意的练习数据结构,在写一道链表的入门题,连链表是什么都不知道的我当然要先去学习一下什么是链表(然后简单的看了一下书上的定义和一些视频发现也没太明白),然后题目中也给出来这么一个注释让我有了初步的了解——talk is cheap,show me the code.
我记得当时提交题目的时候还注释了一下

嗯,这就是当时的图片。当时就是虽然大致了解了一下,但是不是太懂,感觉跟那个递归特别像,这就是对链表的一次直观形象的认识。

链表的本质

今天又在看一道链表的入门题,但是就像上面那个备注一样,对于上面定义代码中的next不太明白,找了一下手边的书,也没有找到相似的代码。于是乎就在群里问了一下
下面是聊天记录
在这里插入图片描述
在这里插入图片描述
也没有聊太多,但是就是在交流之中就这么突然明白了。有时候一些问题不明白,问别人的时候可能刚发出去自己就明白了。可能是自己一个人想比较混乱,但是跟别人描述的时候就会尽量的把问题捋顺清楚吧。正是这样不断的next,不断的一个接一个的嵌套,不才有了所谓的链吗,就是一串自己连在一起一样。

学习方法小结

我个人也看了很多很多关于如何学习的文章,个人觉得总结起来就是2方面:

  • 英语
    我以前觉得这2个可能是平级的,或者英语更重要,但是我现在觉得可能做更重要一些,就拿编程来说,不能一直寻找所谓的好方法而一直止步不前,更重要的是动手去做,在动手去写代码的过程中慢慢的就会有更适合自己的方法。就像我如果一直在重复的看书上的链表的知识点,而没有动手去实践,就不会有今天的认识链表,而且很可能看着看着就看不下去了。然后是英语,如果要想走的更远的话,对于计算机来说,英文水平不行是很难的,但是也不是说,我就要看英文书籍,看英文视频,可以先从中文的学起,到一定水平了在慢慢的去看更大的世界。当然我觉得选一个喜欢的或者熟悉的语言和书籍也比较重要,记得当时学校选的教程是那本很主流的那个(紫色封面),可能也因为自己c学的也不咋地吧,可能是因为书籍纸张不好,排版难看(对,一定是因为这个!)导致我根本就看不下去这本书。因为对Java稍微熟悉一丢丢(第一层水平),所以看到这个链表的定义才会有些感悟吧。

2020.03.26更
之前写道通过linked list的定义大致了解了什么是链表。当时的理解大致就是,通过定义里面的next域不断的套娃,然后就形成了一条“链”,但是当时有个疑问就是,这不就是无限循环了吗,怎么让它停下来呢。今天在另一个学习视频中对linked list有了更深刻的了解,正好解决了我的疑问。
在这里插入图片描述
从这段代码中我们可以发现,要通过Node nodeA = new Node(6);这样的语句来给数值域赋值,但是给数值域赋值和给指针域赋值并不是同步进行的,如果单单给数值域进行赋值,指针域会默认为null;这样就阻止了linked list的无限循环,然后在通过nodeA.next = nodeB;单独让指针链接到下一个node。
在这里插入图片描述
只要理解了linded list的内部原理,然后双向链表(doubly-linked list)之类的也就好理解了,只需要在内部定义一个指向前一个node的prev就好。
另外就是array和linked list的一些基本的特征,我主要想强调一下,数组如果想增加长度不能简单的在最后直接加,必须从新申请足够的内存然后把整个数组都搬过去。对于linked list的话,可以想象为每一个node之间通过一个绳子链接,可以方便的修改长度。但是因为array的每一个item所占的长度都是固定的,所以可以方便的计算出每个元素(eg:第98个)所在的位置,但是linked list是用“绳子”链接的,长度不固定,所以查找就不方便了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章