class Node<T>
{
public T data;
public Node<T> next=null;
public Node()
{ }
public Node(T i)
{
this.data = i;
}
}
class LinkList<T>
{
private Node<T> head;
public LinkList()
{
head = null;
}
/// <summary>
/// 判断链表的长度
/// </summary>
/// <returns></returns>
public int count()
{
Node<T> p = head;//定义一个节点
int count = 0;//链表计数器
while (p != null)
{
count++;
p = p.next;
}
return count;
}
/// <summary>
///
/// </summary>
/// <param name="i">第i个节点</param>
/// <returns></returns>
public T GetItem(int i)
{
Node<T> p = head;
int k = 0;
if (i>count()||i<0)
{
Console.WriteLine("i不存在");
}
while (k<i)
{
k++;
p = p.next;
}
return p.data;
}
public void Insert(T e, int i)
{
Node<T> p = new Node<T>(e);
Node<T> q = head;
int k = 0;
if (i==0)
{
p.next = head;
head = p;
return;
}
while (k<i-1)
{
k++;
q = q.next;
}
p.next = q.next;
q.next = p;
}
/// <summary>
/// 在链表末尾添加新节点
/// </summary>
public void Add(T i)
{
Node<T> p = new Node<T>(i);//要插入的节点
Node<T> q = new Node<T>();
//如果链表为空则把新节点赋给head节点
if (head == null)
{
head = p;
return;
}
#region 如果节点不为空,遍历该链表
q = head;
while (q.next != null)
{
q = q.next;
}
q.next = p;
#endregion 如果节点不为空,遍历该链表
}
/// <summary>
/// 移除链表上某个节点
/// </summary>
/// <param name="i"></param>
public void RemoveAt(int i)
{
Node<T> p = head;
int k = 0;
if (i>count()||i<0)
{
Console.WriteLine("Error");
}
if (i==0)
{
head.next = head.next.next;
return;
}
while (k<i-1)
{
k++;
p = p.next;
}
p.next = p.next.next;
}
public int IndexOf(T e)
{
Node<T> p = head;
int k = 0;
while (p.next!=null)
{
if (p.data.Equals(e))
{
return k;
}
k++;
p = p.next;
}
if (!p.data.Equals(e))
{
k++;
}
return k >= count() ? -1 : k;
}
/// 查找某个元素在链表中最后一次出现的位置
/// </summary>
/// <param name="e">要查找的元素</param>
/// <returns>这个元素在链表中最后一次出现的位置的索引</returns>
public int LastIndexOf(T e)
{
Node<T> p = head;
int index = -1;//最后一次出现的位置索引
int k = 0;//计数器
/*------------------------------------------------
* 遍历整个链表,直到链表结束,每发现相应节点的值
* 与该元素相等,则将该节点的位置索引赋给index,
* 这样index的值就是最后一次的值。如果没有,则返
* 回-1
-------------------------------------------------*/
while (p.next != null)
{
if (p.data.Equals(e))
{
index = k;
}
k++;
p = p.next;
}
if (p.data.Equals(e))
{
index = k;
}
return index;
}
/// <summary>
/// 判断链表是否为空
/// </summary>
/// <returns></returns>
public bool Empty()
{
return head == null ? true : false;
}
/// <summary>
/// 清空链表
/// </summary>
public void Clear()
{
head = null;
}
public void ToArrary()
{
T[] arr = new T[count()];
Node<T> p = head;
int i = 0;
while (p!=null)
{
arr[i++] = p.data;
p = p.next;
}
for (int j = 0; j < count(); j++)
{
Console.Write(arr[j] + " ");
}
}
/// <summary>
/// 删除链表中值为某个元素的所有节点
/// </summary>
/// <param name="e"></param>
public void Remove(T e)
{
if (head.data.Equals(e))
{
head = head.next;
}
Node<T> p = head;
while (p.next.next!=null)
{
if (p.next.data.Equals(e))
{
p.next = p.next.next;
continue;
}
p = p.next;
}
if (p.next.data.Equals(e))
{
p.next = null;
}
}
/// <summary>
/// 链表反转
/// </summary>
public void Reverse()
{
Node<T> p = head;
Node<T> q = p;
Node<T> newHead = head;
p = p.next;
newHead.next = null;
while (p.next!=null)
{
q = p;
p = p.next;
q.next = newHead;
newHead = q;
}
q = p;
q.next = newHead;
newHead = q;
head = newHead;
}
/// <summary>
/// 打印链表
/// </summary>
public void PrintLinkList()
{
Node<T> p = head;
while(p!=null)
{
Console.Write(p.data+" ");
p = p.next;
}
}
}
class Program
{
static void Main(string[] args)
{
//Node node = new Node();
LinkList<int> linkList = new LinkList<int>();
for (int i = 0; i < 7; i++)
{
linkList.Add(i);
}
//linkList.ToArrary();
//linkList.RemoveAt(4);
//linkList.Insert(10, 3);
//Console.WriteLine(linkList.IndexOf(7));
linkList.PrintLinkList();
linkList.Reverse();
linkList.PrintLinkList();
//Console.WriteLine(linkList.GetItem(4));
Console.Read();
}
}