数据结构之 链表的常用方法

什么是链表?

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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值