zoukankan      html  css  js  c++  java
  • 自定义一个能接收不同数据类型的链表

    在C#中,面对链表的场景可使用LinkedListLinkedList可以被看作是一个集合,集合元素的类型为LinkedListNode ,与其他集合元素不同的是:LinkedListNode不仅存储本身的值,还包含对上一个节点、下一个节点的引用。反编译LinkedListNode可以看到大致如下:

     

    public sealed class LinkedListNode<T>{
    
        internal T item;
    
        internal LinkedListNode<T> next;
    
        internal LinkedListNode<T> prev;
    
        ......
    
    }
    

    使用LinkedList如下:

     

            static void Main(string[] args)
    
            {
    
                LinkedList<string> strs = new LinkedList<string>();
    
                strs.AddFirst("b");
    
                strs.AddFirst("a");
    
                foreach (var item in strs)
    
                {
    
                    Console.Write(item + " ");
    
                }
    
                Console.ReadKey();
    
            }
    

     

    以上,LinkedList中每个LinkedListNode节点的数据类型都是LinkedListNode ,可是,如果作为链表节点的LinkedListNode数据类型不一样,怎么办呢?

     

    我们来自定义一个链表的节点,使之能接收不同类型的数据。在自定义链表节点中,每个节点的数据类型可能是不一样的,但在该链表节点中有关指向下一个链表节点的属性类型是一样的,可以先提炼出一个链表节点基类:

     

        public class Node
    
        {
    
            protected Node _next;
    
            public Node(Node next)
    
            {
    
                _next = next;
    
            }
    
        }
    

     

    代表链表节点的泛型类实现该基类。

     

        public class MyNode<T> : Node
    
        {
    
            public T _data;
    
            public MyNode(T data, Node next) : base(next)
    
            {
    
                _data = data;
    
            }
    
            public MyNode(T data) : this(data, null)
    
            {
    
                
    
            }
    
            public override string ToString()
    
            {
    
                return _data.ToString() + " " + ((_next != null) ? _next.ToString() : "");
    
            }
    
        }    
    


    在客户端这样调用:

            static void Main(string[] args)
    
            {
    
                Node node = new MyNode<DateTime>(DateTime.Now);
    
                node = new MyNode<string>("现在的时间是", node);
    
                Console.WriteLine(node.ToString());
    
                Console.ReadKey();
    
            }


    总结:泛型类也是类,可以派生与某个具体类。以上,借助MyNode实现接收不同数据类型,通过 MyNode的父类Node实现对下一个节点引用的抽象。        

  • 相关阅读:
    java 多线程踩过的坑
    css transform旋转属性
    java 实现JSON数据格式化
    shell if判断
    Shell脚本变量判断参数命令
    CentOS7 yum方式安装mysql5.7客户端安装
    sed命令你给删除指定行
    awk查询文件最长或者最短行
    Ansible离线安装
    gitlab的仓库迁移到新的gitlab
  • 原文地址:https://www.cnblogs.com/darrenji/p/4156105.html
Copyright © 2011-2022 走看看