• 数据结构|-用C#实现一个简单的链表


    我们知道C#中是没有链表的,我们可以自己实现一个

     

    整个单链表能实现的功能有:

    功能 方法 返回值 备注
    获取链表长度 GetLength() int 返回值是链表长度
    清空链表 Clear() void  
    判断链表是否为空 IsEmpty() bool  
    添加元素 Add(T item) void 在链表尾添加元素
    在指定位置插入元素 Insert(T item,int index) void 插入的元素就是第index位
    删除指定位置元素 Delete(int index) T  
    索引器 this[int index] T 类似数组的索引器
    获取指定位置的值 GetEle(int index) T 以位取值
    获取值所在的位置 Locate(T value) int 以值取位

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    首先是结点类Node.CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _001_线性表 {
        /// <summary>
        /// 单链表的结点
        /// </summary>
        /// <typeparam name="T"></typeparam>
        class Node<T>
        {
            private T data;//存储数据
            private Node<T> next;//指针 用来指向下一个元素
    
            public Node()
            {
                data = default(T);
                next = null;
            }
    
            public Node(T value)
            {
                data = value;
                next = null;
            }
    
            public Node(T value, Node<T> next)
            {
                this.data = value;
                this.next = next;
            }
    
            public Node(Node<T> next)
            {
                this.next = next;
            }
    
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
    
            public Node<T> Next
            {
                get { return next; }
                set { next = value; }
            } 
        }
    }

    然后是链表的具体功能的实现LinkList

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _001_线性表 {
        class LinkList<T>
        {
            private Node<T> head;//存储一个头结点
    
            public LinkList()
            {
                head = null;
            }
    
    
            public int GetLength()
            {
                if (head == null) return 0;
                Node<T> temp = head;
                int count = 1;
                while (true)
                {
                    if (temp.Next != null)
                    {
                        count++;
                        temp = temp.Next;
                    }
                    else
                    {
                        break;
                    }
                }
                return count;
            }
    
            public void Clear()
            {
                head = null;
            }
    
            public bool IsEmpty()
            {
                return head == null;
            }
    
            public void Add(T item)
            {
                Node<T> newNode = new Node<T>(item);//根据新的数据创建一个新的节点
                //如果头结点为空,那么这个新的节点就是头节点
                if (head == null)
                {
                    head = newNode;
                }
                else
                {//把新来的结点放到 链表的尾部
                    //要访问到链表的尾结点
                    Node<T> temp = head;
                    while (true)
                    {
                        if (temp.Next != null)
                        {
                            temp = temp.Next;
                        }
                        else
                        {
                            break;
                        }
                    }
                    temp.Next = newNode;//把新来的结点放到 链表的尾部
                }
            }
    
            public void Insert(T item, int index)
            {
                Node<T> newNode = new Node<T>(item);
                if (index == 0) //插入到头节点
                {
                    newNode.Next = head;
                    head = newNode;
                }
                else
                {
                    Node<T> temp = head;
                    for (int i = 1; i <=index-1; i++)
                    {
                        //让temp向后移动一个位置
                        temp = temp.Next;
                    }
                    Node<T> preNode = temp;
                    Node<T> currentNode = temp.Next;
                    preNode.Next = newNode;
                    newNode.Next = currentNode;
                }
            }
    
            public T Delete(int index)
            {
                T data = default(T);
                if (index == 0) //删除头结点
                {
                    data = head.Data;
                    head = head.Next;
                }
                else
                {
                    Node<T> temp = head;
                    for (int i = 1; i <= index - 1; i++) {
                        //让temp向后移动一个位置
                        temp = temp.Next;
                    }
                    Node<T> preNode = temp;
                    Node<T> currentNode = temp.Next;
                    data = currentNode.Data;
                    Node<T> nextNode = temp.Next.Next;
                    preNode.Next = nextNode;
                }
                return data;
            }
    
            public T this[int index]
            {
                get
                {
                    Node<T> temp = head;
                    for (int i = 1; i <= index; i++) {
                        //让temp向后移动一个位置
                        temp = temp.Next;
                    }
                    return temp.Data;
                }
            }
    
            public T GetEle(int index)
            {
                return this[index];
            }
    
            public int Locate(T value)
            {
                Node<T> temp = head;
                if (temp == null)
                {
                    return -1;
                }
                else
                {
                    int index = 0;
                    while (true)
                    {
                        if (temp.Data.Equals(value))
                        {
                            return index;
                        }
                        else
                        {
                            if (temp.Next != null)
                            {
                                temp = temp.Next;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    return -1;
                }
            }
        }
    }

     

     

  • 相关阅读:
    php.ini中设置session过期时间
    IP(Internet Protocal) 地址 说明
    html年月日下拉联动菜单 年月日三下拉框联动
    使用数组的键值,做为变量名的方法
    html中js只允许输入数字
    阿里云服务器问题攻略
    小帆远行
    Android图片转换类 1. Bitmap去色,转换为黑白的灰度图, 2. Bitmap图片加圆角效果
    EditText禁止输入回车
    Android之系统自带的文字外观设置
  • 原文地址:https://www.cnblogs.com/wq-KingStrong/p/10282239.html
Copyright © 2020-2023  润新知