手寫單連結串列基礎之增,刪,查!附贈一道連結串列題

奮進的小樣發表於2021-02-17

​一,文章簡介

大家好,該文章是本人的公眾號第一篇文章,是想通過最基礎的資料結構來延伸出後面的演算法題目。想必大家都知道演算法和資料結構一直是程式設計師的必修課,但是我發現一味的刷題未必就會有好的效果,畢竟題目都是百變的。也正因為如此,個人想出一個方法先去熟悉下最基礎的知識,比如該篇的單連結串列結構。在掌握基礎原理知識後,再去刷題多少就會感覺知其然而知其所以然。好了,話不多說請看文章。

二,單連結串列簡介

單連結串列(Singly Linked List)一種常見的資料結構,又名單向連結串列/線性表,單連結串列是以節點的方式儲存,也就是鏈式儲存。
單連結串列的每個節點會包含Data域和Next域,Next域是指向下個節點,
單連結串列是需要一個頭指標來指向頭節點的,需要宣告的是頭指標和頭節點是不一樣的,頭指標是指向第一個頭節點的,而頭節點是單連結串列中的第一個節點。那麼回過頭來再看我們上面說的一個節點是包括Data域和Next域的,如下圖所示:

使用頭指標指向頭節點,每個節點之間的連結,如下圖所示:

通過上面簡單的介紹幫助大家回顧下單連結串列的結構,接下來就和大家分享編寫模擬一個單連結串列的實現。

三,初始化單連結串列

3.1 定義節點結構

我們定義一個節點屬性包括城市編號(僅以用作標示),城市名稱。

初始化好節點後接著還需要建立一個頭指標節點

3.2 新增節點(尾插法)

新增節點大致分為2步,
第一步:定義一個輔助指標,用來指引下一個節點。
第二步:迴圈遍歷節點,直到遍歷到最後一個節點時,將該節點的next指向新插入的節點。如下圖所示:

為方便我們驗證新增節點的方法,再來一個遍歷的單連結串列的方法。單連結串列的遍歷與新增節點的第二步類似,同樣使用輔助指標移動,如果next不為空,則直接列印出來,為了圖省事就在CityNode中直接重寫了toString方法(QAQ)。

接著來個main方法測試一下:

測試結果:

3.3 新增指定節點(按照編號插入)

按照順序插入節點其實就相當於在指定位置插入,大致的思路是,先獲取到要插入節點的位置,如果該節點不是最後一個節點,那麼需要將該節點前面節點的next指向該新增節點。而新增節點的next就需要指向原節點的下個節點,以插入進單連結串列中。

第一步:同樣定義輔助指標,用來遍歷需要插入節點的位置

第二步:當獲取到要插入節點位置後,更改新增節點的next位置,如圖所示:

第三步:更改插入位置的next指標,將其指向新增的節點,如圖所示:

3.4 刪除節點

按照上述案例,通過城市編號刪除一個指定節點。那麼按照上面的套路,毫無疑問是同樣需要一個輔助指標的。但是刪除節點有個小小的細節,也就是我們定義的輔助指標是不能直接指向要刪除的節點,如圖:

如果輔助指標直接指向要刪除的節點,這樣是無法正常刪除的,因此我們是需要將輔助指標指向要刪除節點的上一個節點,通過更改next的指引來刪除,如圖:

四,小試牛刀(237)

先來分析一波題目,題中給出了連結串列的節點資料和要指定刪除的節點。誒,等下~~~咋沒有頭節點???

好吧,其實這道題不僅要考察連結串列的結構,還要考察腦智商~

如果按照文章的描述,這道題就沒法做了,因為給的資訊是不全的。但換種思路去思考的話,題目中指定刪除的節點為【5】,假設我們定義一個輔助變數指標的話,如圖:

那麼問題來了,輔助指標指向要刪除的節點,是無法直接刪除該節點。但如果我們把節點【5】的下一個節點【1】將節點【5】替換調。

按照當前思路的話,節點【5】已經不存在了,但是多處了節點【1】,那我們那隻需要將節點【1】刪除一個即可。按照刪除節點的套路,可以這樣寫。

// 1,將刪除節點的下個節點複製替換 node.data = node.next.data;
// 2,將節點【1】的指標直接指向節點【9】 node.next = node.next.next;

五,總結

上述篇幅中,介紹了單連結串列的尾插法和指定位置插入及刪除,當親自寫一遍後其實發現並不難。當我們理解單連結串列的基礎原理後,我們再來看看關於連結串列的題目。

看到這些題目有沒有什麼感觸呢?
但是不急,關於連結串列的演算法題會在後續的文章中與大家分享出來,每道題都分析出原理知識。

本篇文章是個人的第一篇,有很多紕漏之處還請包含。後期的文章個人會更注重文章的質量,包括排版給讀者一個更清晰的視覺。才疏學淺,有錯誤之處還請多多指教。

相關文章