数据结构之链表

node 类

public class Node<T>
    {
        public T Date;
        //
        public Node<T> Next;
        public Node()
        {
            Date = default(T);
            Next = null;
        }
        public Node(T value)
        {
            Date = value;
            Next = null;
        }
    }

LinkList 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinkList
{

    //一般链表都是有头部节点的 简称为头结点 头结点不参与运算
    public class LinkList<T>
    {
        private Node<T> _head;
        private int _count;

        public LinkList()
        {
            //new 对象 _head.next --> null head.data = 0
            _head = new Node<T>();
            _count = 0;
        }

        public void AddItem(Node<T> newNode)
        {
            //找到头结点
            Node<T> tmpNode = _head;
            //循环找到最后结点
            while (tmpNode.Next != null)
            {
                tmpNode = tmpNode.Next;
            }
            //将最后结点和即将插入的结点链接
            tmpNode.Next = newNode;
            //个数++
            _count++;
        }
        public void Insert(int index, Node<T> newNode)
        {
            Node<T> tempNode = _head;
            if (index<0 || index>_count)
            {
                Console.WriteLine("over!!");
                return;
            }
            for (int i = 0; i < index; i++)
            {
                tempNode = tempNode.Next;
            }
            newNode.Next = tempNode.Next;
            tempNode.Next = newNode;
            _count++;
        }

        public T RemoveAt(int index)
        {
            Node<T> temp = _head;

            Node<T> tempNext = default(Node<T>);
            if (index < 0 || index >= _count)
            {
                Console.WriteLine("over!!");
                return tempNext.Date;
            }
            for (int i = 0; i < index; i++)
            {
                //目标前一个节点
                temp = temp.Next;
                
            }
            //目标节点
            tempNext = temp.Next;
            //目标前 拉 目标后
            temp.Next = tempNext.Next;
            //目标后 设为null
            tempNext.Next = null; 
            _count--;
            return tempNext.Date;
        }
        public void ShowItem(Action<int,T> ac)
        {
            Node<T> tmp = _head;
            if (_count == 0)
            {
                Console.WriteLine("Null");
                return;
            }
            for (int i = 0; i < _count; i++)
            {
                ac(i, tmp.Next.Date);
                tmp = tmp.Next;
            }
        }
        /// <summary>
        /// 递归实现链表倒序     法一
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public Node<T> ReverseLink(Node<T> node)
        {
            if (node.Next == null)
            {
                return node;
            }
            Node<T> rHead = ReverseLink(node.Next);
            node.Next.Next = node;
            node.Next = null;
            return rHead;
        }
        /// <summary>
        /// 倒序
        /// </summary>
        public void Reverse()
        {

            //递归实现链表倒序        法一
            //没节点 或只有一个
            if (_head.Next == null || _head.Next.Next == null)
            {
                return;
            }
            _head.Next = ReverseLink(_head.Next);
            return;

            法二
            Node node = _head.Next;
            Node temp = node;
            while (temp != null)
            {
                node = _head.Next;
                if (temp != null)
                {
                    _head.Next = temp;
                    temp = temp.Next;
                    _head.Next.Next = node;
                }
                else
                {
                    temp = temp.Next;
                    node.Next.Next = null;
                }
            }
            


            //法三
            Node <T> node = _head.Next;
            Node<T> shang = null;
            Node<T> xia = null;
            while (node != null)
            {
                xia = node.Next;
                node.Next = shang;
                shang = node;
                node = xia;
            }
            _head.Next = shang;
        }
        //法四
         public void LLWH_Reverse()
        {
            Node<T> T1, T2;
            T2 = _head.Next;
            _head.Next = null;
            while (T2 != null)
            {
                T1 = T2.Next;
                T2.Next = _head.Next;
                _head.Next = T2;
                T2 = T1;
            }
        }

        public int GetLength()
        {
            return _count;
        }
        public void Clear()
        {
            _head.Next = null;
            _count = 0;
        }
    }
}

法四应用

class MyClass
    {
        public string name;
        public MyClass(string name)
        {
            this.name = name;
        }
        public static bool Querys(Node<MyClass> node1,Node<MyClass> node2)
        {
            bool returnValue = false;
            if (node1.Date.name.Length > node2.Date.name.Length)
            {
                returnValue = true;
            }
            return returnValue;
        }
    }
    class Program
    {
        static void Show(int index,MyClass value)
        {
            Console.WriteLine("第{0}个元素是 : {1}",index+1,value.name);
        }
        static void Main(string[] args)
        {

            LinkList<MyClass> link = new LinkList<MyClass>();
            link.AddItem(new Node<MyClass>(new MyClass("我")));
            link.AddItem(new Node<MyClass>(new MyClass("最帅")));
            link.AddItem(new Node<MyClass>(new MyClass("恩恩额")));
            link.AddItem(new Node<MyClass>(new MyClass("是你最帅")));
            link.AddItem(new Node<MyClass>(new MyClass("是蟋蟀的帅")));
            link.ShowItem(Show);
            
            Console.WriteLine("-------删除最小值-------");
            MyClass my = link.RemoveMix(MyClass.Querys);
            Console.WriteLine(my.name);
            link.ShowItem(Show);
            Console.ReadLine();
        }
    }```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值