链接列表和泛型类型

时间:2015-06-05 00:09:54

标签: c# generics linked-list msdn

我正在学习C#泛型类型,我对MSDN网站上的Generic模块中的链表示例感到困惑: http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

我在这里粘贴代码: 我的困惑在于:

private Node next;

我该如何理解这行代码?  我只能认为它是一个用类名创建的私有字段?

 public Node Next                   
 {
   get { return next; }
   set { next = value; }
 }

我想这是一个以类名作为类型的属性?

private Node head;  

为什么嵌套的类名出现在应该是head类型的位置? 这是一个类GenericList<T>的私有字段吗?

// type parameter T in angle brackets 
public class GenericList<T> 
{
    // The nested class is also generic on T. 
    private class Node
    {
        // T used in non-generic constructor. 
        public Node(T t)
        {
            next = null;
            data = t;
        }

        **private Node next;**    // How should I
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }

        // T as private member data type. 
        private T data;

        // T as return type of property. 
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;

    // constructor 
    public GenericList() 
    {
        head = null;
    }

    // T as method parameter type: 
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

private Node next;  
     

我该如何理解这行代码?

nextNode

类型的私有字段
public Node Next                   
{
    get { return next; }
    set { next = value; }
}
     

我猜这是一个类名作为其类型的属性?

这是一个名为Next的属性,其类型为Node

private Node head;  
     

为什么嵌套的类名出现在应该是头部类型的位置?
  这是一个班级GenericList<T>的私人领域吗?

因为它是head的类型,是的,它是外部类的私有字段。

这里没什么特别的,一个类可以有与自身类型相同的字段,属性等

编辑 关于评论“如何通过创建嵌套类类型节点的字段来使代码工作?(...)加上字段'next '无论何时创建Node实例,都被定义为null“

所有“魔法”都在AddHead方法中 当你创建一个实例GenericList(比如GenericList)时,head为空 所以在这一步之后我们可以说列表可以表示为 []

然后你调用AddHead(1)作为例子;它创建一个具有该值的Node,然后将它设置为当前头的,最后将新创建的Node作为新头。
所以在这一步之后,列表是: 1 - &gt; [] (带有1的头部链接到它的下一个节点;空节点也称为空列表)

之后如果再次拨打AddHead,请说2;你会以这样的结尾结束: 2 - &gt; 1 - &gt; []

当有时间迭代时你只需要在头部不为空(即null)时循环,读取它的存储值并使用链接节点(它的下一个)作为“新头”