什麼是鏈表(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是用“繩子”鏈接的,長度不固定,所以查找就不方便了。

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