自己建立的一个单向链表

public class DLinkList<T>
    {
        private DNode<T> head;//头指针
        private int count; // 字段 ,不用这么加

        //public DLinkList(T value)
        //{
        //    head = new DNode<T>(value);
        //}

        /// <summary>
        /// 新增元素
        /// </summary>
        /// <param name="value"></param>
        public void Add(T value) {
            DNode<T> newNode = new DNode<T>(value);
            if (head == null) // 链表为空,头插入
            {
                head = newNode;
            }
            else { //插入到尾部
                GetDNodeByIndex(count - 1).next = newNode;
            }
            this.count++;
        }

        /// <summary>
        /// 删除指定索引处的值
        /// </summary>
        /// <param name="index"></param>
        public void RemoveAt(int index) {
            if (index == 0)
            {
                head = head.next;
            }
            else {
                var prevNode = GetDNodeByIndex(index - 1);
                if (prevNode.next == null) {
                    throw new ArgumentOutOfRangeException("index", "超出链表索引范围");
                }
                prevNode.next = prevNode.next.next;
            }
            count--;
        }


        /// <summary>
        /// 在指定索引出插入值
        /// </summary>
        /// <param name="index">插入位置</param>
        /// <param name="value">插入的值</param>
        public void InsertAt(int index, T value)
        {
            if (index > count)
            {
                throw new ArgumentOutOfRangeException("index", "超出链表索引范围");
            }
            var tempNode = new DNode<T>(value);
            if (index == 0)// 头部插入
            {
                if (head == null)
                {
                    head = tempNode;
                }
                else
                {
                    tempNode.next = head.next;
                    head = tempNode;
                }
            }
            else {
                var prev = GetDNodeByIndex(index - 1);
                tempNode.next = prev.next;
                prev.next = tempNode;
            }
        }

        /// <summary>
        /// 根据索引查找元素
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        public DNode<T> GetDNodeByIndex(int index) {
            if (index > this.count)
            {
                throw new ArgumentOutOfRangeException($"index({index})的值超过链表长度");
            }
            var p = head;
            for (int i = 0; i < index; i++)
            {
                p = p.next;
            }
            return p;
        }

        public override string ToString()
        {
            var s = new StringBuilder();
            for (DNode<T> p = head; p != null; p = p.next)
            {
                s.Append(p.ToString());
                s.Append(" ");
            }
            return s.ToString();
        }

        public T this[int index]{
            get { return GetDNodeByIndex(index).value; }
            set { GetDNodeByIndex(index).value = value; }
        }

        /// <summary>
        /// 获取链表总数
        /// </summary>
        public int Count => count;

        public class DNode<T>
        {
            public DNode(T value)
            {
                this.value = value;
            }
            public T value;
            public DNode<T> next;
            public override string ToString()
            {
                return value.ToString();
            }
        }
    }

 

posted @ 2022-07-31 13:51  vba是最好的语言  阅读(29)  评论(0编辑  收藏  举报