理论基础:
链表是用一组任意的存储单元来存储线性表中的数据元素。
如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(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;
}
}