1027

42 阅读2分钟

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();


    }
}

}