【轉載】每天5分鐘用C#學習資料結構(3)單鏈表 Part 1
阿新 • • 發佈:2020-05-30
在上一篇中,我們學習了線性表最基礎的表現形式-順序表,但是其存在一定缺點:必須佔用一整塊事先分配好的儲存空間,在插入和刪除操作上需要移動大量元素(即操作不方便),於是不受固定儲存空間限制並且可以進行比較快捷地插入和刪除操作的連結串列橫空出世,所以我們就來複習一下連結串列,這一篇主要會集中在單鏈表。
1. 認識單鏈表
單鏈表的節點結構
在連結串列中,每個節點由兩部分組成:資料域和指標域。
單鏈表的總體結構
連結串列就是由N個節點連結而成的線性表,如果其中每個節點只包含一個指標域那麼就稱為單鏈表,如果含有兩個指標域那麼就稱為雙鏈表。
PS:線上性表的鏈式儲存結構中,為了便於插入和刪除操作的實現,每個連結串列都帶有一個頭指標(或尾指標),通過頭指標可以唯一標識該連結串列。從頭指標所指向的節點出發,沿著節點的鏈可以訪問到每個節點。
2. 單鏈表的實現
多說無益,現在我們直接動手用C#來實現一個單鏈表吧!
節點定義
public class Node<T>
{
// 資料域
public T Item { get; set; }
// 指標域
public Node<T> Next { get; set; }
public Node() {}
public Node(T item)
{
this.Item = item;
}
}
此處定義Node類為單鏈表的節點,其中包括了一個數據域Item與一個指標域Next(指向後繼節點的位置)。
節點的新增
① 預設在尾節點後插入新節點
public void Add(T value) { Node<T> newNode = new Node<T>(value); if (this.head == null) { // 如果連結串列當前為空則置為頭結點 this.head = newNode; } else { Node<T> prevNode = this.GetNodeByIndex(this.count - 1); prevNode.Next = newNode; } this.count++; }
首先判斷頭結點是否為空,其次依次遍歷各節點找到尾節點的前驅節點,然後更改前驅節點的Next指標指向新節點即可。
② 指定在某個節點後插入新節點
public void Insert(int index,T value)
{
Node<T> tempNode = null;
if (index < 0 || index > this.count)
{
throw new ArgumentOutOfRangeException("index","索引超出範圍");
}
else if (index == 0)
{
if (this.head == null)
{
tempNode = new Node<T>(value);
this.head = tempNode;
}
else
{
tempNode = new Node<T>(value);
tempNode.Next = this.head;
this.head = tempNode;
}
}
else
{
Node<T> prevNode = GetNodeByIndex(index - 1);
tempNode = new Node<T>(value);
tempNode.Next = prevNode.Next;
prevNode.Next = tempNode;
}
this.count++;
}
這裡需要判斷是否是在第一個節點進行插入,如果是則再次判斷頭結點是否為空。
3. 小結
本文介紹了另一種線性表:單鏈表,學習了單鏈表的基礎知識及如何定義節點及如何通過兩種方式來新增單鏈表的節點。下一篇我們會學習如何移除節點以及做一個完整的示例來演示單鏈表的操作。
[轉載:每天5分鐘用C#學習資料結構(3)單鏈表 Part 1](Edison Zhou)