陣列和連結串列
定義:
- 陣列:是一種線性的資料結構,用一組連續的記憶體空間來儲存的具有相同資料型別的資料;
-
連結串列:跟陣列一樣也是也是一種線性的資料結構,連結串列的記憶體結構不是連續性,是將一組零散的記憶體塊串聯起來,從而進行資料儲存的結構;連結串列中的每一個記憶體塊被稱為節點Node,節點除了儲存資料外,還需要記錄下一個節點的地址。(單鏈表、迴圈連結串列、雙向連結串列)
1.png
時間複雜度:
- 陣列:插入、刪除的時間複雜度為O(n),因為需要保持陣列記憶體空間的連續性,需要插入(刪除)的資料往後(前)移動;查詢的的時間複雜度為O(1),根據下標能直接找到資料;
-
連結串列:插入、刪除的時間複雜度為O(1);查詢的的時間複雜度為O(n):因為連結串列的儲存空間是不連續性的(資料並非聯絡儲存的),只能通過指標一個個的往下遍歷
452e943788bdeea462d364389bd08a17.jpg
缺點:
- 陣列:1)需要連續的記憶體空間;2)大小固定,如果儲存空間不足,需要進行擴容就會申請一個更大的空間,將資料拷貝過去,而資料拷貝的操作是非耗時的;
- 連結串列:對連結串列進行頻繁的插入和刪除操作,會導致頻繁的記憶體申請和釋放,容易造成記憶體碎片
public class LinkedList<T> { public Node<T> Head { get; set; } public LinkedList() { this.Head = null; } /// <summary> /// 節點插入到最後 /// </summary> /// <param name="item"></param> public void Insert(T item) { Node<T> operNode = new Node<T>(item); Node<T> current = new Node<T>(); if (Head == null) { Head = operNode; return; } current = Head; while (current.Next != null) { current = current.Next; } current.Next = operNode; } /// <summary> /// 刪除第i個節點 /// </summary> /// <param name="i"></param> public void Delete(int i) { Node<T> temp = new Node<T>(); Node<T> p = new Node<T>(); if (i == 1) { Head = Head.Next; return; } temp = Head; int j = 1; while (temp.Next != null && j < i) { j++; p = temp; temp = temp.Next; } if (j == i) { p.Next = temp.Next; } } } public class Node<T> { public Node(T item) { this.Data = item; this.Next = null; } public Node() { this.Data = default(T); this.Next = null; } public T Data { get; set; } public Node<T> Next { set; get; } }