鍊錶的相關知識整理

2022-07-15 03:06:11 字數 2287 閱讀 5057

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。

回憶下陣列的概念 ,所謂陣列,是相同資料型別的元素按一定順序排列的集合。根據概念我們可以知道陣列在記憶體中連續,鍊錶不連續;由於不同的儲存方式導致陣列靜態分配記憶體,鍊錶動態分配記憶體,陣列元素在棧區,鍊錶元素在堆區;由於陣列在記憶體中連續,我們可以利用下標定位,時間複雜度為o(1),鍊錶定位元素時間複雜度o(n);但是由於陣列的連續性陣列插入或刪除元素的時間複雜度o(n),鍊錶的時間複雜度o(1)。總結一下,陣列和鍊錶的區別如下

1.陣列靜態分配記憶體,鍊錶動態分配記憶體

2.陣列在記憶體中連續,鍊錶不連續

3.陣列元素在棧區,鍊錶元素在堆區

4.陣列利用下標定位,時間複雜度為o(1),鍊錶定位元素時間複雜度o(n);

5.陣列插入或刪除元素的時間複雜度o(n),鍊錶的時間複雜度o(1)。

以單鏈表為例,根據鍊錶的定義我們先定義鍊錶節點的資料結構

public class node

//無參建構函式,用例例項化node節點

public node()

public nodenext

set

}public t data

set

}}

接下來我們來實現鍊錶的操作,構造乙個鍊錶,在構造煉表裡我們定乙個頭結點的物件,頭結點是個很有用的節點,在後續**中就可以慢慢體會到

public class mylinklist

//構造器

public mylinklist()

}

1.求鍊錶的長度,思路:從頭結點向後訪問,直到最後乙個節點,**如下

public int length()

return len;

}

2.清空鍊錶,這個就比較奧簡單了,直接將頭結點置為null 即可,**如下

public void clear()

3.同理判斷鍊錶是否為空也要用的頭結點

public bool isempty()

else

}

4.在鍊錶的末尾新增新元素,新增新元素,需要先判斷鍊錶是否為空,如果為空我們要給頭結點賦值,如果不為空需要修改最後乙個節點的next指向,**如下

var p = new node();

p = head;

while (p.next != null)

p.next = new node(item, null);

}5.在單鏈表的第i個結點的位置前插入乙個指定結點,首先需要找到插入的位置,然後修改相鄰節點的指向即可, **如下

public void insert(t item, int i)

//如果在第乙個位置插入 則只需要將該節點的next 指向head即可

if (i == 1)

var p = new node();

p = head;

var left = new node();

var right = new node();

int j = 1;

while (p.next != null && j < i)

var q = new node(item, null);

left.next = q;

q.next = right;

}

6.刪除指定節點,先找到要刪除的前乙個結點,然後修改該結點的next指向即可  **略。。。。

·  7.鍊錶還有刪除、獲取、查詢等操作,基本思想都是一樣的,就不一一介紹了

1. 求單鏈表中結點的個數

2. 將單鏈表反轉

3. 查詢單鏈表中的倒數第k個結點(k > 0)

4. 查詢單鏈表的中間結點

5. 從尾到頭列印單鏈表

6. 已知兩個單鏈表phead1 和phead2 各自有序,把它們合併成乙個鍊錶依然有序

7. 判斷乙個單鏈表中是否有環

8. 判斷兩個單鏈表是否相交

9. 求兩個單鏈表相交的第乙個節點

10. 已知乙個單鏈表中存在環,求進入環中的第乙個節點

11. 給出一單鏈表頭指標phead和一節點指標ptobedeleted,o(1)時間複雜度刪除節點ptobedeleted

好了就擼到這裡,題目是劍指offer裡的題目,大家可以解答下,有問題聯絡我

鍊錶基礎知識整理

關於鍊錶最重要的是搞清楚指標的指向,next域存放的是下乙個結點的位址。1 順序建煉表要定義頭指標,游動指標,尾部指標 逆序建立鍊錶定義頭指標和游動指標即可,每次將新的結點插在頭指標後面。搞清楚指標的指向即可。2 刪除結點。定義乙個游動指標,還要定義乙個指標,為了記後乙個結點的位址。順序建表 inc...

鍊錶合併 分隔鍊錶等相關常見演算法整理

合併兩個有序鍊錶 力扣 21 合併k個排序鍊錶 力扣 23 分隔鍊錶 力扣 86 鍊錶節點 public class listnode 題目 將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。分析合併兩個有序鍊錶,可以使用2種方式來實現 遞迴法 分別...

陣列相關知識的整理

陣列有什麼特點 怎麼用相關的演算法 特點 eg int score score new int 5 初始化 動態初始化 賦值 注意事項 快速初始化氣泡排序public static void main string args arrsort arr public static void arrsor...