以下是要实现链表的一个单个Node
public class WNode
{
public object data;
public WNode Next;
public WNode()
{
data = null;
Next = null;
}
public WNode(object data, WNode next)
{
this.data = data;
Next = next;
}
public WNode(object data)
{
this.data = data;
Next = null;
}
}
/// <summary>
/// 单向链表
/// </summary>
public class WLinkList
{
private WNode m_head;
private int m_Count;
public int Count { get { return m_Count; } private set { m_Count = value; } }
/// <summary>
/// 构造函数第一个Node为头
/// </summary>
/// <param name="head"></param>
public WLinkList(WNode head)
{
m_head = head;
m_Count = 1;
}
/// <summary>
/// 构造函数,不传进来参数默认是空链表
/// </summary>
public WLinkList()
{
m_head = null;
m_Count = 0;
}
/// <summary>
/// 将Node放到链表末端
/// </summary>
/// <param name="node"></param>
public void AddLinkNode(WNode node)
{
//当链表元素数量为0时第一个加入的node为头
if(m_Count==0)
{
m_head = node;
}
else
{
//查找得到最后一个Node
WNode tempNode = FindNode(null);
//将最后一个Node的Next指向传递进来的参数
tempNode.Next = node;
}
//链表元素数量增加
m_Count++;
}
/// <summary>
/// 根据传递进来的删除Node
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public bool RemoveLinkNode(WNode node)
{
//如果当前链表元素为0时没办法删除
if(m_Count==0)
{
Console.WriteLine("当前链表中没有储存数据");
return false;
}
//查找得到要删除元素的上一个Node
WNode tempNode = FindNode(node);
//上一个Next指向下下个Node
tempNode.Next = tempNode.Next.Next;
//元素数量减少一个
m_Count--;
return true;
}
/// <summary>
/// 插入链表
/// </summary>
/// <param name="node"></param>
/// <param name="index"></param>
/// <returns></returns>
public bool InsertLinkNode(WNode node,int index)
{
//当要插入的序号大于数量时,没有多余的位置可以插入数据
if(index>m_Count-1)
{
Console.WriteLine("要插入的位置前部没有Node");
return false;
}
//当要插入的位置为第一个时需要替换链表头部
if(index==0)
{
//传进来的指向头部
node.Next = m_head;
//将头部指向传进来的node
m_head = node;
return true;
}
//因为要插入至前一个所以要得到之前一个的Node
WNode tempNode = FindNode(index-1);
//传进来的尾指针指向当前的下一个即要插入之前的一个Node
node.Next = tempNode.Next;
//之前的Node尾指针指向传进来的Node
tempNode.Next = node;
return true;
}
#region 遍历查找Node方法
/// <summary>
/// 根据Node来查找Node的上一个数据(缺省的话就是查找最后一个Node)
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private WNode FindNode(WNode node)
{
if (m_Count==0)
{
Console.WriteLine("链表内没有保存数据");
return null;
}
WNode tempNode = m_head;
while (tempNode.Next!= node)
{
if(tempNode.Next == null)
{
Console.WriteLine("没查找到数据");
return null;
}
tempNode = tempNode.Next;
}
return tempNode;
}
/// <summary>
/// 根据传递进来的序号来查找
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public WNode FindNode(int index)
{
if (index > m_Count - 1)
{
Console.WriteLine("查找越界");
return null;
}
int tempCount = 0;
WNode tempNode = m_head;
while (tempCount != index)
{
tempCount++;
tempNode = tempNode.Next;
}
return tempNode;
}
#endregion
}