C#双向循环链表

本文介绍了C#中双向不循环链表的实现,包括如何添加结点、读取元素、修改查找结点、删除结点及输出链表的详细步骤。通过实例代码展示了链表的各种操作,并提到了Visual Studio的代码折叠快捷键,帮助读者更高效地管理和阅读代码。
摘要由CSDN通过智能技术生成

最后有全部代码,可直接复制拿走运行


还有很多地方不足,有错误的地方也请各位大佬指出
写此篇文章目的是给小白参考,有不懂的地方可以留言

C#双向不循环链表:点击查看

感觉代码太乱又刚好使用的Visual Studio编译
不妨使用下快捷方式?
vs折叠域代码快捷键:ctrl + k + 0;
展开折叠代码快捷键:ctrl + k + J;

添加结点


        /// <summary>
        /// Node类 添加新结点
        /// </summary>
        private class Node
        {
   
            public Node pre;
            public E e;
            public Node next;

            /// <summary>
            /// 有参构造函数 为结点存放数据和指针
            /// </summary>
            /// 双链表中  一个pre、一个e和一个next组成一个结点
            ///<param name="pres">存放前一个元素的位置(指针)</param>
            /// <param name="e">存放结点值的数据域(元素/数据)</param>
            /// <param name="next">存放后一个元素的位置(指针)</param>
            public Node(Node pres, E date, Node nexts)
            {
   
                this.pre = pres;
                this.e = date;
                this.next = nexts;
            }
            /// <summary>
            /// 有参构造函数 为结点存放数据和指针(指针指向空)
            /// </summary>
            /// <param name="e">存放结点值的数据域(元素/数据)</param>
            public Node(E e)
            {
   
                this.pre = null;
                this.e = e;
                this.next = null;
            }
            /// <summary>
            /// 重写Node类的输出方法
            /// </summary>
            public override string ToString()
            {
   
                return e.ToString();
            }

各种方法实现

初始字段和属性

        //head为链表的第一个结点
        private Node head;
        //N代替指针 永远指向末尾的空
        private int N;
        /// <summary>
        /// 无参构造函数 为字段赋值
        /// </summary>
        public BidirectionalCircularLinkedList()
        {
   
            head = new Node(null, default(E), null);
            head.pre = head;
            head.next = head;
            N = 0;
        }

        /// <summary>
        /// 访问链表内结点个数
        /// </summary>
        /// <returns>返回当前列表内结点个数</returns>
        public int Count
        {
   
            get {
    return N; }
        }

        /// <summary>
        /// 判断链表中是否为空
        /// </summary>
        /// <returns>为空返回true,否则返回false</returns>
        public bool IsEmpty
        {
   
            get {
    return N == 0; }
        }

添加结点

    /// <summary>
    /// 添加 向链表指定下标添加结点
    /// </summary>
    /// <param name="index">指定下标</param>
    /// <param name="e">结点的数据(元素)</param>
    /// <exception cref="ArgumentException">指定下标小于0或者大于N</exception>
    public void Add(int index, E e)
    {
   
        if (0 > index || index > N)
            throw new ArgumentException("非法索引");

        Node move = head;

        Node node = new Node(e);

        //根据索引位置判断从那个指针移动最快
        if (((float)index / N) < 0.5 || index == 0 || index == N)//index除N小于0.5使用next指针 否则使用pre
        {
   
            for (int i = 0; i < index - 1; i++)
                move = move.next;
        }
        else
        {
   
            for (int i = 0; i < N - index + 1; i++)
                move = move.pre;
        }
        //向头部插入结点
        if (index == 0)
        {
   
            node.next = head;
            //链表内有/无值时分别设置头部的pre指针指向
            if (N == 0)
                node.pre = node;
            else
                node.pre = head.pre;
            head.pre.next = node;
            head.pre = node;
            head = node;
        }
        //向尾部部插入结点
        else if (index == N)
        {
   
            node.next = head;
            node.pre = move;
            move.next = node;
            head.pre = node;
        }
        //向表中间插入结点
        else
        {
   
            node.next = move.next;
            node.pre = move;
            move.next.pre = node;
            move.next = node;
        }
        //将指针向后移动一位
        N++;
    }

    /// <summary>
    /// 向链表头部添加结点
    /// </summary>
    /// <param name="e">结点的数据(元素)</param>
    public void AddFirst(E e)
    {
   
        Add(0, e);
    }

    /// <summary>
    /// 向链表尾部添加结点
    /// </summary>
    /// <param name="e">结点的数据(元素)</param>
    public void AddLast(E e)
    {
   
        Add(N, e);
    }

读取结点元素

 /// <summary>
    /// 读取 链表内指定下标的结点元素
    /// </summary>
    /// <param name="index">指定下标</param>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值