什么是链表?
1.链表是用一组任意的存储单元来存储线性表中的数据元素
2.链表在存储数据元素时,除了存储数据元素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为节点。
3.链表方便插入和删除
如图:
链表的常用方法
namespace 链表
{
public class Node
{
public int Date;
public Node Next;
public Node()
{
Date = default(int);
Next = null;
}
public Node(int value)
{
Date = value;
Next = null;
}
}
}
namespace 链表
{
public class LinkList
{
private Node _head;
private int _count;
public LinkList()
{
_head = new Node();
_count = 0;
}
public void AddItem(Node newNode)
{
//找到头结点
Node tmpNode = _head;
//循环找到最后一位
while(tmpNode.Next != null) //后一个不为null的时候
{
tmpNode = tmpNode.Next; //后移一位
}
tmpNode.Next = newNode; //跳出循环就把 newNode添加进去
_count++;
}
public int GetCount()
{
return _count; //返回长度
}
public void Insert(int index, Node newNode) //插入的索引和值
{
if (index < 0 || index > _count) //索引出界
{
Console.WriteLine("Over");
return;
}
Node tmpNode = _head;
for (int i = 0; i < index; i++)
{
tmpNode = tmpNode.Next; //后移找index前一个结点
}
//tmpNode index的前一个结点
newNode.Next = tmpNode.Next; //牵手之前的tmpNode.Next
tmpNode.Next = newNode;
_count++;
//0~l-1
// l
}
public int Remove(int index)
{
int returnValue = default(int); //定义一个Data的默认返回值
if(index < 0 || index > _count) //判断是否出界
{
Console.WriteLine("有问题");
goto Tip; //如果出界直接 goto 到下面 并返回默认值
}
Node tmpNode = _head; //所需删除的结点 的前一个结点
for(int i=0; i < index;i++)
{
tmpNode = tmpNode.Next;
}
Node tmp = tmpNode.Next; //定义一个临时的 要删除的结点
tmpNode.Next = tmpNode.Next.Next; //牵手(要删除的结点)的后一个结点
tmp.Next = null; //不让(要删除的结点)与后一个结点链接
_count--; //长度--
returnValue = tmp.Date; //返回要删除结点的Date值
Tip:
return returnValue; //返回
}
/// <summary>
/// 第一个就是index 第二个是value
/// </summary>
/// <param name="ac"></param>
public void ShowItem(Action<int, int> ac) //遍历链表
{
if (_count == 0)
{
Console.WriteLine("空");
return;
}
Node tmNode = _head.Next;
for (int i = 0; i < _count; i++)
{
ac(i, tmNode.Date);
//后移动
tmNode = tmNode.Next;
}
}
public void Reverce() //链表的倒序
{
Node temp01;
Node temp02;
temp02 = _head.Next; //让temp02成为除头结点之外的第一个节点
_head.Next = null; //让头结点指向空
while(temp02 != null)
{
temp01 = temp02.Next;
temp02.Next = _head.Next;
_head.Next = temp02;
temp02 = temp01;
}
}
public int RemoveMin() //链表删除最小值
{
Node delepreMin; //要删除的最小值的前一个节点
Node deleMin; //要删除的最小值的节点
Node preMin;
Node Min; //对应指针
delepreMin = _head;
preMin = _head;
deleMin = delepreMin.Next;
Min = preMin.Next;
while(Min != null)
{
if(Min.Data < deleMin.Data) //找最小值
{
delepreMin = preMin;
deleMin = Min;
}
preMin = preMin.Next;
Min = Min.Next;
}
delepreMin.Next = delepreMin.Next.Next; //开始删除最小值
deleMin.Next = null;
_count--;
return deleMin.Data; //开始返回最小节点的data
}
}
namespace 链表
{
class Program
{
public static void Main(string[] args)
{
LinkList linkList = new LinkList();
linkList.AddItem(new Node(1));
linkList.AddItem(new Node(2));
linkList.AddItem(new Node(3));
linkList.AddItem(new Node(4));
linkList.AddItem(new Node(5));
//linkList.Insert(2, new Node(100));
//linkList.Remove(2);
linkList.Reverse();
Console.WriteLine(linkList.GetCount());
Console.ReadLine();
}
}
}