• 单链表的实现


        //单链表结点类,采用泛型
        public class Node<T>
        {
            private T data; //数据域,当前结点的数据
            private Node<T> next; //引用域,即下一结点
    
            //构造器:数据域+引用域,普通结点
            public Node(T item, Node<T> p)
            {
                data = item;
                next = p;
            }
    
            //构造器:引用域,头结点
            public Node(Node<T> p)
            {
                next = p;
            }
    
            //构造器:数据域,尾结点
            public Node(T val)
            {
                data = val;
                next = null;
            }
    
            //构造器:无参数
            public Node()
            {
                data = default(T);
                next = null;
            }
    
            //数据域属性
            public T Data
            {
                get
                {
                    return data;
                }
                set
                {
                    data = value;
                }
            }
    
            //引用域属性
            public Node<T> Next
            {
                get
                {
                    return next;
                }
                set
                {
                    next = value;
                }
            }
        }
    
        //链表类,包含链表定义及基本操作方法
        public class MyLinkList<T>
        {
            private Node<T> head; //单链表的头结点
    
            //头结点属性
            public Node<T> Head
            {
                get
                {
                    return head;
                }
                set
                {
                    head = value;
                }
            }
    
            //构造器
            public MyLinkList()
            {
                 head = null;
            }
    
            //求单链表的长度
            public int GetLength()
            {
                Node<T> p = head;
                int len = 0;
                while (p != null)
                {
                    ++len;
                    p = p.Next;
                }
                return len;
            }
    
            //清空单链表
            public void Clear()
            {
                head = null;
            }
    
            //判断单链表是否为空
            public bool IsEmpty()
            {
                if (head == null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            //在单链表的末尾添加新元素
            public void Append(T item)
            {
                Node<T> q = new Node<T>(item);
                Node<T> p = new Node<T>();
                if (head == null)
                {
                    head = q;
                    return;
                }
                p = head;
                while (p.Next != null)
                {
                    p = p.Next;
                }
                p.Next = q;
            }
    
            //在单链表的第i个结点的位置前插入一个值为item的结点
            public void Insert(T item, int i)
            {
                
                if (IsEmpty() || i < 1||i>GetLength ())
                {
                    Console.WriteLine("LinkList is empty or Position is error!");
                    return;
                }
                if (i == 1)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = head;
                    head = q;
                    return;
                }
                Node<T> p = head;
                Node<T> r = new Node<T>();
                int j = 1;
                while (p.Next != null && j < i)
                {
                    r = p;
                    p = p.Next;
                    ++j;
                }
                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p;
                    r.Next = q;
                }
            }
    
            //在单链表的第i个结点的位置后插入一个值为item的结点
            public void InsertPost(T item, int i)
            {
                if (IsEmpty() || i < 1||i>GetLength ())
                {
                    Console.WriteLine("LinkList is empty or Position is error!");
                    return;
                }
                if (i == 1)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = head.Next;
                    head.Next = q;
                    return;
                }
                Node<T> p = head;
                int j = 1;
                while (p != null && j < i)
                {
                    p = p.Next;
                    ++j;
                }
                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p.Next;
                    p.Next = q;
                }
            }
    
            //删除单链表的第i个结点
            public T Delete(int i)
            {
                if (IsEmpty() || i < 0 || i > GetLength())
                {
                    Console.WriteLine("LinkList is empty or Position is error!");
                    return default(T);
                }
                Node<T> q = new Node<T>();
                if (i == 1)
                {
                    q = head;
                    head = head.Next;
                    return q.Data;
                }
                Node<T> p = head;
                int j = 1;
                while (p.Next != null && j < i)
                {
                    ++j;
                    q = p;
                    p = p.Next;
                }
                if (j == i)
                {
                    q.Next = p.Next;
                    return p.Data;
                }
                else
                {
                    Console.WriteLine("The "+i+"th node is not exist!");
                    return default(T);
                }
            }
    
            //获得单链表的第i个数据元素
            public T GetElem(int i)
            {
                if (IsEmpty() || i < 0)
                {
                    Console.WriteLine("LinkList is empty or position is error! ");
                    return default(T);
                }
                Node<T> p = new Node<T>();
                p = head;
                int j = 1;
                while (p.Next != null && j < i)
                {
    
                    ++j;
                    p = p.Next;
                }
                if (j == i)
                {
                    return p.Data;
                }
                else
                {
                    Console.WriteLine("The "+i+"th node is not exist!");
                    return default(T);
                }
            }
    
            //在单链表中查找值为value的结点
            public int Locate(T value)
            {
                if (IsEmpty())
                {
                    Console.WriteLine("LinkList is Empty!");
                    return -1;
                }
                Node<T> p = new Node<T>();
                p = head;
                int i = 1;
                while (!p.Data.Equals(value) && p.Next != null)
                {
                    p = p.Next;
                    ++i;
                }
                return i;
            }
    
            //显示链表
            public void Display()
            {
                Node<T> p = new Node<T>();
                p = this.head;
                while (p != null)
                {
                    Console.Write(p.Data+" ");
                    p = p.Next;
                }
            }
        }

    实例测试程序代码

        public class Program
        {
            static void Main(string[] args)
            {
                MyLinkList<string> myLinkList = new MyLinkList<string>(); //实例化一个单链表
                Console.WriteLine(myLinkList.GetLength());   //获取长度
    
                //添加元素
                myLinkList.Append("good");
                myLinkList.Append("monring");
                myLinkList.Append("lwk");
    
                myLinkList.Insert("!", 5);  //在i结点前插元素,位置错误测试
                myLinkList.InsertPost("!", 5);  //在i结点后插元素,位置错误测试
    
                myLinkList.InsertPost("!", 3);  //后插元素
                myLinkList.Insert(",", 3);  //前插元素
    
                myLinkList.Display();  //显示链表元素
    
                Console.WriteLine(myLinkList.GetElem(4));//获取结点,并显示
    
                myLinkList.Delete(1);  //删除结点
    
                myLinkList.Display();
    
                Console.WriteLine(myLinkList.GetLength()); //显示链表长度
                Console.Read();
            }
        }
  • 相关阅读:
    [改善Java代码]养成良好习惯,显式声明UID
    [改善Java代码]警惕自增的陷阱
    [改善Java代码]覆写变长方法也循规蹈矩
    [改善Java代码]别让null值和空值威胁到变长方法
    [改善Java代码]避免带有变长参数的方法重载
    [改善Java代码]三元操作符的类型务必一致
    关于Windows下mysql忘记root密码的解决方法
    关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
    关于关闭Eclipse的控制台自动跳出
    关于Windows下如何查看端口占用和杀掉进程
  • 原文地址:https://www.cnblogs.com/greyhh/p/4810343.html
Copyright © 2020-2023  润新知