using System.Security.Cryptography.X509Certificates;
namespace demo1027 {
//2.创建一个链表类
public class LinkList<T>
{
//头结点
public LinkNode<T> head;
//尾节点
public LinkNode<T> last;
public void Add(T value)
{
//如果链表是空的
if (head==null)
{
//当前插入到头结点的位置
LinkNode<T> node = new LinkNode<T>();
node.value = value;
head = node;
last = node;
}
else
{
//如果不是空的 说明插入到最后的位置 更新一下尾节点
LinkNode<T> node = new LinkNode<T>();
node.value = value;
last.nextnode = node;
last = node;
}
}
//查询
public object Find(T value)
{
//找里面的第一个满足的值,返回该节点给我 从头节点开始遍历
LinkNode<T> node = head;
while (node!=null)//什么时候跳出循环,找到满足条件的值 或 node为空
{
if (node.value.Equals(value))
{
return node;
}
node = node.nextnode;
}
return -1;
}
//删除
public void Remove(T value)
{
//删除的情况:头 中间 尾
LinkNode<T> node = head;//先存一下头结点
while (node!=null)
{
//是头结点的情况
if (head.value.Equals(value))
{
if (node.nextnode == null)
{
head = null;
last = null;
}
else
{
head = head.nextnode;
}
return;
}
if (node.nextnode == null) return;//如果是最后一个节点直接跳出
//中间结点的情况 找到上一个节点
if (node.nextnode.value.Equals(value))
{
if (node.nextnode.nextnode!=null)
{
//删除中间结点
node.nextnode = node.nextnode.nextnode;
}
else
{
//删除尾节点
node.nextnode = null;
last = node;
}
return;
}
node = node.nextnode;
}
}
//插入到某个节点的前面和后面
public void InsertBefore(LinkNode<T> node,T value)
{
//找到这个节点 如果没有这个节点 啥也不用做
LinkNode<T> first = head;
LinkNode<T> newNode = new LinkNode<T>();
newNode.value = value;
while (first != null)
{
if ( node==head)//找到了就往前插入
{
//如果插入的是在头结点前
newNode.nextnode = head;
head = newNode;
return;
}
//插入到前面又得找上一个节点
if (first.nextnode == node)
{
newNode.nextnode = node;//新节点的下一个节点应该指向的node
first.nextnode = newNode;
return;
}
first = first.nextnode;
}
}
public void Insertafter(LinkNode<T> node,T value)
{
//插入到最后的节点的后面 或插入到中间结点的后面
/*LinkNode<T> first = last;
LinkNode<T> newNode = new LinkNode<T>();
newNode.value = value;
while (first != null)
{
if (node == last)
{
last.nextnode = newNode;
last=newNode;
return;
}
if (node.nextnode ==first )
{
node.nextnode = newNode;
newNode.nextnode =first ;
return;
}
first.nextnode=first;
}*/
LinkNode<T> first = head;
LinkNode<T> newNode = new LinkNode<T>();
newNode.value = value;
//插入到最后的节点的后面 或插入到中间结点的后面
if (node == last)
{
last.nextnode = newNode;
last = newNode;
return;
}
while (first != null)
{
if (first == node)
{
newNode.nextnode = first.nextnode.nextnode;
first.nextnode = newNode;
return;
}
first = first.nextnode;
}
}
}
//1.创建节点类
public class LinkNode<T>
{
public T value;
public LinkNode<T> nextnode;
}
internal class Program
{
static void Main(string[] args)
{
/* //new一个链表
LinkList<string> list = new LinkList<string>();
list.Add("asdasd");
*//* list.Remove("asdasd");
Console.WriteLine(list.Find("asdasd"));
list.Add("asdasd");
Console.WriteLine(list.Find("asdasd"));*//*
LinkNode<string> node = (LinkNode<string>)list.Find("asdasd");
list.InsertBefore(node, "123");
//Console.WriteLine(list.head.value);//123
LinkNode<string> node1= (LinkNode<string>)list.Find("123");
list.Insertafter(node1, "sss");
//Console.WriteLine(list.last.value);//asdasd
Console.WriteLine(node1.nextnode.value);//sss
*/
//new一个链表 系统c#提供了一个链表类 linkedlist
LinkedList<string> list = new LinkedList<string>();
list.AddFirst("asdasd");//插入到头结点的位置
list.AddFirst("aa");//插入到头结点的位置
LinkedListNode<string> node = list.Find("asdasd");
Console.WriteLine(node.Next);//指的是下一个节点
Console.WriteLine(node.Previous.Value);//指的是上一个节点
list.AddAfter(node,"新节点");
Console.WriteLine(list.First.Value);//头结点
Console.WriteLine(list.Last.Value);//尾结点
// aa asdasd 新节点
//list.RemoveFirst();//删除 aa
list.Remove(node);//删除
Console.WriteLine(list.First.Value);
Console.WriteLine(list.Find("asdasd"));
Console.WriteLine(list.Last.Value);//新节点
Console.WriteLine(list.Count);//2
foreach(string i in list)
{
Console.WriteLine(i);
}
Console.WriteLine(list.Contains("新节点"));
list.Clear();
}
}
}