【C# 数据结构 -- 单链表】

链表接口类

定义部分方法体,继承类进行实现,方便扩展。

/** 链表接口 */
    public interface ILinkList<T>
    {
        int GetLength();
        void Clear();
        bool IsEmpty();
        void Append(T item);
        void Insert(T item, int i);
        void InsertPort(T item, int i);
        T Delete(int i);
        T GetWithIndex(int i);
        int GetWithValue(T value);
        void ReverseNoHead();
        void ReverseWithHead();
    }

节点类

节点组成:当前数据域以及下一节点的引用

/** 节点类 */
    public class LinkNode<T>
    {
        private T data;
        public T Data
        {
            get => data;
            set => data = value;
        }
        private LinkNode<T> nextNode;
        public LinkNode<T> NextData
        {
            get => nextNode;
            set => nextNode = value;
        }
        public LinkNode(T data, LinkNode<T> next = null)
        {
            this.data = data;
            nextNode = next;
        }
        public LinkNode()
        {
            this.data = default;
            nextNode = null;
        }
    }

链表类

/** 链表类 */
    public class LinkList<T> : ILinkList<T>
    {
        private LinkNode<T> head;
        public LinkNode<T> Head
        {
            get => head;
            set => head = value;
        }

        public LinkList()
        {
            head = null;
        }

        /** 链表长度*/
        public int GetLength()
        {
            int lengthLink = 0;
            LinkNode<T> node = head;
            while (node != null)
            {
                lengthLink++;
                node = node.NextData;
            }
            return lengthLink;
        }

        /** 清空链表*/
        public void Clear()
        {
            head = null;
        }

        /** 链表判空*/
        public bool IsEmpty()
        {
            return head == null;
        }

        /** 链表末尾添加元素*/
        public void Append(T item)
        {
            LinkNode<T> newItem = new LinkNode<T>(item);
            LinkNode<T> temp = new LinkNode<T>();
            if(head == null)
            {
                head = newItem;
                return;
            }
            temp = head;
            while (temp.NextData != null)
            {
                temp = temp.NextData;
            }
            temp.NextData = newItem;
        }

        /** 指定位置添加元素*/
        public void Insert(T item, int i)
        {
            if (IsEmpty() || i <= 0 || GetLength() < i) return;
            LinkNode<T> node = null;
            if (i == 1)
            {
                node = new LinkNode<T>(item);
                node.NextData = head;
                head = node;
                return;
            }
            node = head;
            LinkNode<T> temp = new LinkNode<T>();
            int j = 1;
            while (node.NextData != null && j < i)
            {
                temp = node;// i-1处的节点
                node = node.NextData;// 原i处的节点
                j++;
            }
            if (j == i)
            {
                LinkNode<T> newNode = new LinkNode<T>(item);
                newNode.NextData = node;
                temp.NextData = newNode;
            }
        }

        /** 指定位置的后一位添加元素*/
        public void InsertPort(T item, int i)
        {
            if (IsEmpty() || i <= 0 || GetLength() < i) return;
            LinkNode<T> node = null;
            if (i == 1)
            {
                node = new LinkNode<T>(item);
                node.NextData = head.NextData;
                head.NextData = node;
                return;
            }
            node = head;
            LinkNode<T> temp = new LinkNode<T>();
            int j = 1;
            while (j <= i && node.NextData != null)
            {
                temp = node;
                node = node.NextData;
                j++;
            }
            if(j == i + 1)
            {
                LinkNode<T> add = new LinkNode<T>(item);
                add.NextData = node;
                temp.NextData = add;
            }
        }

        /** 删除指定位置元素*/
        public T Delete(int i)
        {
            if (IsEmpty() || i <= 0 || GetLength() < i) return default(T);
            LinkNode<T> node = new LinkNode<T>();
            if (i == 1)
            {
                node = head;
                head = head.NextData;
                return node.Data;
            }
            LinkNode<T> targetNode = head;
            int j = 1;
            while (targetNode.NextData != null && j < i)
            {
                node = targetNode;
                targetNode = targetNode.NextData;
                j++;
            }
            if (j == i)
            {
                node.NextData = targetNode.NextData;
                return targetNode.Data;
            }
            return default(T);
        }

        /** 获取指定位置元素数据*/
        public T GetWithIndex(int i)
        {
            if (IsEmpty() || i <= 0 || GetLength() < i) return default(T);
            LinkNode<T> targetNode = head;
            int j = 1;
            while (targetNode.NextData != null && j < i)
            {
                targetNode = targetNode.NextData;
                j++;
            }
            if (j == i)
            {
                return targetNode.Data;
            }
            return default(T);
        }

        /** 根据值获取指定元素数据*/
        public int GetWithValue(T value)
        {
            if (IsEmpty()) return -1;
            LinkNode<T> targetNode = head;
            int j = 1;
            while (targetNode != null && !targetNode.Data.Equals(value))
            {
                targetNode = targetNode.NextData;
                j++;
            }
            if (targetNode!=null)
            {
                return j;
            }
            return -1;
        }

        /** 链表倒置 原头节点为新链表头节点*/
        public void ReverseNoHead()
        {
            LinkNode<T> p = head.NextData;
            LinkNode<T> q = new LinkNode<T>();
            head.NextData = null;
            while (p != null)
            {
                q = p;
                p = p.NextData;
                q.NextData = head.NextData;
                head.NextData = q;
            }
        }

        /** 链表倒置 原头节点为新链表尾节点*/
        public void ReverseWithHead()
        {
            LinkNode<T> temp1 = null;
            LinkNode<T> temp2 = null;
            while (head != null)
            {
                temp2 = head.NextData;
                head.NextData = temp1;
                temp1 = head;
                head = temp2;
            }
            head = temp1;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值