/// <summary>
/// 节点类
/// </summary>
/// <typeparam name="T"></typeparam>
class Node<T>
{
private T date; //数据域
private Node<T> next;//指针域
public T Date { get => date; set => date = value; }
internal Node<T> Next { get => next; set => next = value; }
public Node()
{
Next = null;
Date = default(T);
}
public Node(T date,Node<T> next)
{
this.Date = date;
this.Next = next;
}
public Node(T date)
{
Next = null;
this.Date = date;
}
public Node(Node<T> next)
{
this.Date = default(T);
this.Next = next;
}
}
/// <summary>
/// 链表类
/// </summary>
class LinkList<T>
{
private Node<T> head; //头指针
private int count; //链表元素个数
public LinkList()
{
head=new Node<T>();//指向头结点
count = 0;
}
//尾插法创建链表
public LinkList(params T[] list):this()
{
Node<T> last = head;
for (int i = 0; i < list.Length; i++)
{
Node<T> newNode = new Node<T>(list[i]);
last.Next = newNode;
last = last.Next;
}
count = list.Length;
}
//遍历单链表的元素
public void Traverse()
{
Node<T> temp = head;
for (int i = 0; i < count; i++)
{
temp = temp.Next;
Console.Write(temp.Date+" ");
}
Console.WriteLine();
}
//判断是否为空
public bool IsEmepty()
{
return head.Next == null;
}
//获取链表长度
public int GetLength()
{
return count;
}
//获取元素索引位置
public int Index(T elem)
{
Node<T> temp = head;
for (int i = 0; i < count; i++)
{
temp = temp.Next;
if (temp.Date.Equals(elem))
{
return i;
}
}
Console.WriteLine("elem:{0}不在链表中", elem);
return -1;
}
//通过索引器获取元素
public T this[int index]
{
get
{
if (index>=count||index<0)
{
throw new IndexOutOfRangeException();
}
Node<T> temp = head;
for (int i = 0; i <=index; i++)
{
temp = temp.Next;
}
return temp.Date;
}
}
//插入元素
public void Insert(int index,T elem)
{
Node<T> temp = head;
Node<T> newNode=new Node<T>(elem,null);
if (index >= count || index < 0)
{
throw new IndexOutOfRangeException();
}
//当为空链表的时候
if (temp.Next == null)
{
temp.Next = newNode;
count++;
}
else
{
for (int i = 0; i < index; i++)
{
temp = temp.Next;
}
newNode.Next = temp.Next;
temp.Next = newNode;
count++;
}
}
//删除元素
public void Delete(int index)
{
Node<T> temp = head;
if (head.Next == null)
{
Console.WriteLine("空表无法删除");
}
if (index >= count || index < 0)
{
throw new IndexOutOfRangeException();
}
for (int i = 0; i < index; i++)
{
temp = temp.Next;
}
temp.Next = temp.Next.Next;
count--;
}
}
LinkList<int> sum=new LinkList<int>(1,2,5,8,5,888,555);
sum.Traverse();
Console.WriteLine(sum.IsEmepty());
Console.WriteLine(sum.GetLength());
Console.WriteLine(sum.Index(8));
Console.WriteLine(sum[6]);
//sum.Insert(2, 120);
//sum.Traverse();
sum.Delete(100);
sum.Traverse();
Console.ReadKey();