理論基礎:
鏈表是用一組任意的儲存單元來儲存線性表中的資料元素。
如果結點的參考網域只儲存該結點直接後繼結點的儲存地址,則該鏈表叫單鏈表(Singly Linked List)。
單鏈表由頭引用H唯一確定。頭引用指向單鏈表的第一個結點,也就是把單鏈表第一個結點的地址放在H中。
C#實現:
1介面
引用線性表的介面IListDS<T>
2實現
首先,必須定義一個單鏈表的節點類
public class Node<T>
{
private T data; //資料域
private Node<T> next; //參考網域
public Node(T val)
{
data = val;
next = null;
}
public Node()
{
data = default(T);
next = null;
}
public T Data
{
get { return data; }
set { data = value; }
}
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}
實現主體類
Append,Insert,InsertBack三個方法實質上都是插入操作,可以考慮用overload或者override來實現,有興趣的朋友試試。
public class LinkList<T> : IListDS<T>
{
private Node<T> head;
public Node<T> Head
{
get { return head; }
set { head = value; }
}
public LinkList()
{
head = null;
}
/// <summary>
/// 擷取長度
/// </summary>
/// <returns></returns>
public int GetLength()
{
Node<T> p = head;
int len = 0;
while (p != null)
{
++len;
p = p.Next;
}
return len;
}
/// <summary>
/// 清空操作
/// </summary>
public void Clear()
{
head = null;
}
/// <summary>
/// 判斷線性表是否為空白
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 附加操作,線性表未滿,將值為item的新元素添加到末尾
/// </summary>
/// <param name="item"></param>
public void Append(T item)
{
Node<T> newNode = new Node<T>(item); //根據元素建立新的節點
Node<T> node = new Node<T>();
if (head == null)
{
head = newNode;
return;
}
node = head;
while (node.Next != null)
{
node = node.Next;
}
node.Next = newNode;
}
/// <summary>
/// 尋找節點
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public Node<T> FindNode(int i)
{
if (IsEmpty())
{
Console.Write("List is empty");
return null;
}
if (i < 1)
{
Console.Write("Index is error");
return null;
}
Node<T> current = head;
int j = 1;
while (current.Next != null && j < i)
{
++j;
current = current.Next;
}
return current;
}
/// <summary>
/// 插入操作,在第i個節點前面插入item
/// </summary>
/// <param name="item"></param>
/// <param name="i"></param>
public void Insert(T item, int i)
{
Node<T> newNode = new Node<T>(item);
Node<T> node = new Node<T>();
Node<T> current = FindNode(i);
if (current != null)
{
node = current; //對目標節點備份
newNode.Next = current;
node.Next = newNode;
}
}
/// <summary>
/// 插入操作,在第i個節點後面插入item
/// </summary>
/// <param name="item"></param>
/// <param name="i"></param>
public void InsertBack(T item, int i)
{
Node<T> newNode = new Node<T>(item);
Node<T> current = FindNode(i);
if (current != null)
{
newNode.Next = current.Next;
current.Next = newNode;
}
}
/// <summary>
/// 刪除操作
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public T Delete(int i)
{
Node<T> current = FindNode(i);
Node<T> node = new Node<T>();
if (current != null)
{
node = current; //對目標節點備份
node.Next = current.Next;
return current.Data;
}
else
{
Console.Write("the node is not exist!");
return default(T);
}
}
/// <summary>
/// 去表元
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public T GetElem(int i)
{
Node<T> current = FindNode(i);
if (current != null)
{
return current.Data;
}
else
{
Console.Write("the node is not exist!");
return default(T);
}
}
/// <summary>
/// 按值尋找
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}
Node<T> current = new Node<T>();
current = head;
int i = 1;
while (current.Next != null && !current.Data.Equals(value))
{
current = current.Next;
++i;
}
return i;
}
}