C#自定义单链表

在C#中模拟库中已存在的集合,链表LinkedList。可以做添加、插入等操作

可以先写一个链表接口,然后再去实现接口的功能

interface IList<T>
    {
        int GetLength();  //取得链表的长度
        void Clear();  //将链表清空
        bool IsEmpty();  //判断链表是否为空
        void Add(T item);  //添加元素
        void Insert(int index, T item);  //根据索引来插入元素,链表长度加一
        T Delete(int index);  //根据索引来删除元素,链表长度减一
        T this[int index] { get; }  //创建一个索引器
        T GetEle(int index);  //根据索引来得到元素
        int Locate(T value);  //根据元素值,从前往后找到对应索引
    }

再创建一个节点类(为了方便,这里直接初始化节点类的数据)

class Node<T> {
        public T data = default(T);  //该节点的数据
        public Node<T> next = null;  //节点指针
    }

实现接口功能

class LinkList<T>:IList<T> {
        private Node<T> head = null;  //链表头节点
        private int count = 0;  //默认链表长度为0

        //添加操作就是新定义一个节点,判断头节点是否为空,为空,则新节点为头节点

//否则定义一个临时节点,用while判断其指针是否为空,循环遍历链表,将新节点放在临时节点的后面

        public void Add(T item)
        {

            count++;   
            Node<T> newNode = new Node<T>();
            newNode.data = item;
            if (head == null)
            {
                head = newNode;
            }
            else
            {
                Node<T> temp = head;
                while (temp.next != null)
                {
                    temp = temp.next;
                }
                temp.next = newNode;
            }
        }

//取得链表长度,直接返回count

        public int GetLength()
        {
            return count;
        }

        public void Clear()
        {
            count=0;
            head = null;
        }

//判断链表是否为空,返回一个bool值

        public bool IsEmpty()
        {
            return count == 0;
        }

//(先写索引器方法再写插入方法,请先看索引器代码)

//插入先考虑用户输入的索引值越界情况,然后再做,定义一个新的节点,

//如果索引值为0,则新节点为头节点,否则定义一个临时变量为头节点,for循环遍历到用户输入索引值前面一位的节点,再得到当前索引节点,将新节点插入到两者之间

        public void Insert(int index, T item)
        {
            if (index < 0 || index >= count) throw new Exception("索引越界");
            else {
                count++;
                Node<T> newNode = new Node<T>();
                newNode.data = item;
                if (index == 0)
                {
                    newNode.next = head;
                    head = newNode;
                }
                else {
                    Node<T> temp = head;
                    for (int i = 1; i <= index-1; i++) {
                        temp = temp.next;
                    }
                    Node<T> preNode = temp;
                    Node<T> curNode = temp.next;
                    preNode.next = newNode;
                    newNode.next = curNode;
                }

            }
        }

//删除操作  如何索引值为零,head = head.next,否则然后再遍历到index前面一位的节点,得到index节点和其后面的一个节点

//将index-1的节点和index+1的节点连接

        public T Delete(int index)
        {
            if (index < 0) {
                throw new Exception("索引超出界限");
            }
            count--;
            Node<T> temp = new Node<T>();
            temp = head;
            if (index == 0)
            {
                head = head.next;
            }
            else
            {

//注意,从head节点遍历到index-1节点,只需要index-1次
                for (int i = 1; i <= index - 1; i++)
                {
                    temp = temp.next;
                }
                Node<T> preNode = temp;
                Node<T> curNode = temp.next;
                Node<T> nextNode = temp.next.next;
                preNode.next = nextNode;
            }

            return this[index];
        }

//索引器,根据index返回值,只需要get方法

        public T this[int index]
        {
            get { 
                Node<T> temp = new Node<T>();
                temp = head;

//注意i从1是开始遍历到index,当index=0时直接返回head的数据,其他大于零的情况,就是把temp向后移动index次
                for (int i = 1; i<=index; i++){
                    temp = temp.next;
                }
                return temp.data;
            }
        }

        public T GetEle(int index)
        {
            if (index < 0 || index >= count) throw new Exception("索引超出界限");
            else {
                return this[index];
            }
        }

        public int Locate(T value)
        {
            int targetIndex = -1;
            Node<T> temp = head;
            for (int i = 0; i < count; i++) {
                if (temp.data.Equals(value))
                {
                    targetIndex = i;
                    break;
                }
                temp = temp.next;
            }
            return targetIndex;
        }

        public void ShowAll()
        {
            Node<T> temp = head;
            while (temp != null)
            {
                Console.Write(temp.data + " ");
                temp = temp.next;
            }
            Console.WriteLine();
            Console.WriteLine("Length:"+count);
        }

//将链表反向输出,递归方法
        //public void ReverseList(Node<int> node){
        //    if (node != null) {
        //        ReverseList(node.next);
        //        Console.WriteLine(node.data);
        //    }
        //}

//将链表反向输出,将链表中数据压栈,再出栈
        public void ReverseList() {
            Stack<T> stack = new Stack<T>();
            Node<T> temp = head;
            while (temp != null) {
                stack.Push(temp.data);
                temp = temp.next;
            }
            for (int i = 0; i < count; i++) {
                Console.WriteLine(stack.Pop());
            }
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值