1. 程式人生 > 實用技巧 >004.線性表9-17

004.線性表9-17

>>> hot3.png

@author: 小甲魚

4.線性表的鏈式儲存結構

1.特點:

1.用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以存在記憶體中未被佔用的任意位置。
2.除了儲存資料元素資訊外,還要儲存它的後記元素的存放地址(指標)。

資料域是:儲存資料元素資訊的域。
指標域是:儲存直接後繼位置的域。
指標或者鏈是:指標域中儲存的資訊。
結點是:這2部分資訊組成資料元素稱為儲存映像/節點(Node)。

n個結點連結成一個連結串列,即為線性表(a1, a2, a3, ..., an)的鏈式儲存結構。

2.單鏈表

此連結串列的每一個結點中只包含一個指標域,叫做單鏈表。
特點:
1.空間大小不需要指定,就像租房一樣,可以隨時更換。

2.資料儲存結構是隨機的,哪裡有空間,哪裡就可以存放資料。

我們把第一個結點的儲存位置叫做:頭指標,最後一個結點指標為空(NULL 或者 ^ )

讀取方式:
1. 從頭結點開始找,直到接到為止
2. 時間複雜度: O(n)
插入方式:

1.改變指向的地址
2.時間複雜度: O(1)

頭指標頭結點的異同:

  • 頭指標:

    • 1.頭指標是指連結串列指向第一個結點的指標;若連結串列有頭結點,而是指向頭結點的指標。
    • 2.頭指標具有標識作用,所以常用頭指標冠以連結串列的名字(指標變數的名字)
    • 3.無論連結串列是否為空,頭指標均不為空。
    • 4.頭指標是連結串列的必要元素
  • 頭結點:

    • 頭結點是為了操作的統一和方便而設立的,放在第一個元素的結點之前,其資料域一般無意義(當也可以用來存放連結串列的長度)。
    • 有了頭結點,對在第一元素結點前插入結點和刪除第一結點起操作域其它結點的操作就統一了。
    • 頭結點不一定是連結串列的必需要素。


插入方式:
1.頭插法

2.尾插法

3.靜態連結串列

概念:用陣列描述的連結串列叫做靜態連結串列。這種描述方法叫遊標實現法
目的:為了給沒有指標的程式語言設計一種單鏈表的實現方式。

1.原理分析

連結串列空間的.首元素存放的是:連結串列元素空間為空,下標最小的元素.
連結串列空間的.尾元素存放的是:遊標指向連結串列元素的首元素.
連結串列元素的.首元素存放的是:結束下標的下一個.
連結串列元素的.尾元素存放的是:0,表示結束。

1.插入元素:
插入B,我們要找到A和C的位置,然後將A的遊標

指向B,然後將B的遊標指向C.


1.刪除元素:
刪除C,我們只是資料清空,然後把指向指向C元素的下標。
而連結串列空間首位置0的下標直線,C的下標。

4.騰訊面試題:

普通方法:

快慢指標:
2個指標AB同時指向,A個指標是B指標的2倍。
當A指標剛好到終點的時候,B指標剛好到的中間位置。

5.迴圈連結串列

就是將單鏈表的終端結點的指標 指向 頭結點,使其頭尾相接,我們稱為:單迴圈連結串列,簡稱迴圈連結串列。

判斷迴圈一次是否完畢:
單鏈表是:head->next是否為null。
迴圈連結串列:head->next是否為head。

終止條件: A-B-A,那麼就該結束叻。

迴圈連結串列的首位結點,時間複雜度都是: O(1)

6.判斷單鏈表中是否有環

方法1: 從0開始

AB二人,A每走一步,B都得從0開始走;
當A走了7步,回到了3;而B從0開始走,發現只走了3步;
所以:AB步數不想等,出現矛盾,存在環。

方法2: 快慢指標

AB二人, A走1步,B走2步,如果有環,那麼遲早要相撞。

7.雙向連結串列


雙向連結串列的結點結構:

雙向連結串列的插入操作:

雙向連結串列的刪除操作:

雙向連結串列的迴圈連結串列:

轉載於:https://my.oschina.net/repine/blog/689366