天天看點

算法系列15天速成——第八天 線性表【下】

一:線性表的簡單回顧

       上一篇跟大家聊過“線性表"順序存儲,通過實驗,大家也知道,如果我每次向

順序表的頭部插入元素,都會引起痙攣,效率比較低下,第二點我們用順序存儲時,容

易受到長度的限制,反之就會造成空間資源的浪費。

二:連結清單

      對于順序表存在的若幹問題,連結清單都給出了相應的解決方案。

1. 概念:其實連結清單的“每個節點”都包含一個”資料域“和”指針域“。

            ”資料域“中包含目前的資料。

            ”指針域“中包含下一個節點的指針。

            ”頭指針”也就是head,指向頭結點資料。

            “末節點“作為單向連結清單,因為是最後一個節點,通常設定指針域為null。

算法系列15天速成——第八天 線性表【下】

代碼段如下:

2.常用操作:

    連結清單的常用操作一般有:

           ①添加節點到連結尾,②添加節點到連結清單頭,③插入節點。

           ④删除節點,⑤按關鍵字查找節點,⑥取連結清單長度。

<1> 添加節點到連結尾:

          前面已經說過,連結清單是采用指針來指向下一個元素,是以說要想找到連結清單最後一個節點,

       必須從頭指針開始一步一步向後找,少不了一個for循環,是以時間複雜度為o(n)。

<2> 添加節點到連結清單頭:

          大家現在都知道,連結清單是采用指針指向的,要想将元素插傳入連結表頭,其實還是很簡單的,

      思想就是:① 将head的next指針給新增節點的next。②将整個新增節點給head的next。

      是以可以看出,此種添加的時間複雜度為o(1)。

效果圖:

算法系列15天速成——第八天 線性表【下】

<3> 插入節點:

           其實這個思想跟插入到”首節點“是一個模式,不過多了一步就是要找到目前節點的操作。然後找到

      這個節點的花費是o(n)。上圖上代碼,大家一看就明白。

算法系列15天速成——第八天 線性表【下】

代碼段:

<4> 删除節點:

        這個也比較簡單,不解釋,圖跟代碼更具有說服力,口頭表達反而讓人一頭霧水。

        當然時間複雜度就為o(n),n是來自于查找到要删除的節點。

算法系列15天速成——第八天 線性表【下】

<5> 按關鍵字查找節點:

         這個思想已經包含到“插入節點”和“删除節點”的具體運用中的,其時間複雜度為o(n)。

<6> 取連結清單長度:

          在單連結清單的操作中,取連結清單長度還是比較糾結的,因為他不像順序表那樣是在記憶體中連續存儲的,

      是以我們就糾結的周遊一下連結清單的總長度。時間複雜度為o(n)。

好了,最後上一下總的運作代碼:

運作結果:

算法系列15天速成——第八天 線性表【下】

當然,單連結清單操作中有很多是o(n)的操作,這給我們帶來了尴尬的局面,是以就有了很多的

優化方案,比如:雙向連結清單,循環連結清單。靜态連結清單等等,這些希望大家在懂得單連結清單的情況下

待深一步的研究。

繼續閱讀