最后有全部代码,可直接复制拿走运行
还有很多地方不足,有错误的地方也请各位大佬指出
写此篇文章目的是给小白参考,有不懂的地方可以留言
感觉代码太乱又刚好使用的Visual Studio编译
不妨使用下快捷方式?
vs折叠域代码快捷键:ctrl + k + 0;
展开折叠代码快捷键:ctrl + k + J;
添加结点
/// <summary>
/// Node类 添加新结点
/// </summary>
private class Node
{
public Node pre;
public E e;
public Node next;
/// <summary>
/// 有参构造函数 为结点存放数据和指针
/// </summary>
/// 双链表中 一个pre、一个e和一个next组成一个结点
///<param name="pres">存放前一个元素的位置(指针)</param>
/// <param name="e">存放结点值的数据域(元素/数据)</param>
/// <param name="next">存放后一个元素的位置(指针)</param>
public Node(Node pres, E date, Node nexts)
{
this.pre = pres;
this.e = date;
this.next = nexts;
}
/// <summary>
/// 有参构造函数 为结点存放数据和指针(指针指向空)
/// </summary>
/// <param name="e">存放结点值的数据域(元素/数据)</param>
public Node(E e)
{
this.pre = null;
this.e = e;
this.next = null;
}
/// <summary>
/// 重写Node类的输出方法
/// </summary>
public override string ToString()
{
return e.ToString();
}
各种方法实现
初始字段和属性
//head为链表的第一个结点
private Node head;
//N代替指针 永远指向末尾的空
private int N;
/// <summary>
/// 无参构造函数 为字段赋值
/// </summary>
public BidirectionalCircularLinkedList()
{
head = new Node(null, default(E), null);
head.pre = head;
head.next = head;
N = 0;
}
/// <summary>
/// 访问链表内结点个数
/// </summary>
/// <returns>返回当前列表内结点个数</returns>
public int Count
{
get {
return N; }
}
/// <summary>
/// 判断链表中是否为空
/// </summary>
/// <returns>为空返回true,否则返回false</returns>
public bool IsEmpty
{
get {
return N == 0; }
}
添加结点
/// <summary>
/// 添加 向链表指定下标添加结点
/// </summary>
/// <param name="index">指定下标</param>
/// <param name="e">结点的数据(元素)</param>
/// <exception cref="ArgumentException">指定下标小于0或者大于N</exception>
public void Add(int index, E e)
{
if (0 > index || index > N)
throw new ArgumentException("非法索引");
Node move = head;
Node node = new Node(e);
//根据索引位置判断从那个指针移动最快
if (((float)index / N) < 0.5 || index == 0 || index == N)//index除N小于0.5使用next指针 否则使用pre
{
for (int i = 0; i < index - 1; i++)
move = move.next;
}
else
{
for (int i = 0; i < N - index + 1; i++)
move = move.pre;
}
//向头部插入结点
if (index == 0)
{
node.next = head;
//链表内有/无值时分别设置头部的pre指针指向
if (N == 0)
node.pre = node;
else
node.pre = head.pre;
head.pre.next = node;
head.pre = node;
head = node;
}
//向尾部部插入结点
else if (index == N)
{
node.next = head;
node.pre = move;
move.next = node;
head.pre = node;
}
//向表中间插入结点
else
{
node.next = move.next;
node.pre = move;
move.next.pre = node;
move.next = node;
}
//将指针向后移动一位
N++;
}
/// <summary>
/// 向链表头部添加结点
/// </summary>
/// <param name="e">结点的数据(元素)</param>
public void AddFirst(E e)
{
Add(0, e);
}
/// <summary>
/// 向链表尾部添加结点
/// </summary>
/// <param name="e">结点的数据(元素)</param>
public void AddLast(E e)
{
Add(N, e);
}
读取结点元素
/// <summary>
/// 读取 链表内指定下标的结点元素
/// </summary>
/// <param name="index">指定下标</param>