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实现对下一个节点引用的抽象。        

  • 相关阅读:
    逆元
    C++快读
    最长单调上升子序列(LIS) O(nlogn)求法
    【简●解】巴厘岛的雕塑
    【简●解】学校食堂
    【简●解】[HNOI2005]星际贸易
    差分约束系统小结
    【简•解】花园
    最小生成树小结
    概率及期望DP小结
  • 原文地址:https://www.cnblogs.com/darrenji/p/4156105.html
Copyright © 2011-2022 走看看