双向链表:
using System;
namespace DS_ALGCode
{
/// <summary>
/// 双向链表
/// </summary>
public class S_LinkedList
{
private Node Head = null;
private Node Tail = null;
private Node Cur = null;
private int NodeCount = 0;
//查指定数据节点
public Node GetNode(int data)
{
Node curNode = Head;
while (curNode != null)
{
if (curNode.Data == data)
return curNode;
curNode = curNode.Next;
}
return null;
}
//尾插节点
public void Append(int data)
{
Node node = new Node(data);
if (Head == null)
{
Head = node;
Tail = node;
}
else
{
Tail.Next = node;//尾插新节点
node.Prev = Tail;//新节点前连尾
Tail = node;//新节点变尾
}
Cur = node;
NodeCount++;
}
//指定数据后插入
public void AppendNodeByData(int tardata, int newdata)
{
Node tarNode = GetNode(tardata);
if (tarNode != null)
{
Node newNode = new Node(newdata);
newNode.Next = tarNode.Next;//原后置为新后置
tarNode.Next.Prev = newNode; //原后置前置为新节点
tarNode.Next = newNode;//原后置为新节点
newNode.Prev = tarNode; //新节点前置为原节点
Cur = newNode;
NodeCount++;
}
}
//查指定数据前置节点
public int GetPrevNodeByData(int tardata)
{
Node tarNode = GetNode(tardata);
if (tarNode != null)
{
return tarNode.Prev.Data;
}
return 0;
}
//删除尾节点
public void DelEndNode()
{
Tail = Tail.Prev;
Cur = Tail;
NodeCount--;
}
//删除指定数据节点
public void DelTarNode(int tardata)
{
Node tarNode = GetNode(tardata);
if (tarNode != null)
{
tarNode.Prev.Next = tarNode.Next;
tarNode.Next.Prev = tarNode.Prev;
NodeCount--;
}
}
//列队
public void Show()
{
Node curNode = Head;
while (curNode != null)
{
Console.WriteLine(curNode.Data);
curNode = curNode.Next;
}
}
}
}