using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
/// <summary>
/// 双向链表
/// </summary>
/// <typeparam name="T"></typeparam>
public class DoubleNode<T>
{
public T Data;
public DoubleNode<T> Preview;
public DoubleNode<T> Next;
public DoubleNode()
{
Data = default(T);
Preview = null;
Next = null;
}
public DoubleNode(T data)
{
Data = data;
Preview = null;
Next = null;
}
}
/// <summary>
/// 双向链表
/// </summary>
public class DoubleCircle<T>
{
public DoubleNode<T> Head;
public int Length = 0;
public DoubleCircle()
{
Head = null;
Length = 0;
}
/// <summary>
/// 尾插入
/// </summary>
/// <param name="data"></param>
public void Add(T data)
{
DoubleNode<T> newNode = new DoubleNode<T>(data);
DoubleNode<T> tmpNode = new DoubleNode<T>();
if(Head==null)
{
Head = new DoubleNode<T>();
}
tmpNode = Head;
while(tmpNode.Next!=null)
{
tmpNode = tmpNode.Next;
}
Length++;
tmpNode.Next = newNode;
newNode.Preview = tmpNode;
newNode.Next = null;
}
/// <summary>
/// 插入
/// </summary>
public void Inset(T data,int i)
{
DoubleNode<T> newNode = new DoubleNode<T>(data);
DoubleNode<T> tmpNode = new DoubleNode<T>();
tmpNode = Head;
if(i>Length)
{
return;
}
int j = 0;
while(j<i-1&&tmpNode.Next!=null)
{
tmpNode = tmpNode.Next;
j++;
}
newNode.Preview = tmpNode;
newNode.Next = tmpNode.Next;
tmpNode.Next.Preview = newNode;
tmpNode.Next = newNode;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="i"></param>
public void Delete(int i)
{
DoubleNode<T> tmpNode = new DoubleNode<T>();
tmpNode = Head;
if (i > Length)
{
return;
}
int j = 0;
while (j < i && tmpNode.Next != null)
{
tmpNode = tmpNode.Next;
j++;
}
tmpNode.Preview.Next = tmpNode.Next;
tmpNode.Next.Preview = tmpNode.Preview;
}
/// <summary>
/// 输出整个链表
/// </summary>
public void PrintLinkList()
{
DoubleNode<T> tmpNode = Head;
while (tmpNode.Next != null)
{
tmpNode = tmpNode.Next;
Console.WriteLine(tmpNode.Data);
}
}
}
}