了解链接列表

时间:2010-06-27 22:50:21

标签: c# linked-list

以下代码用作example作为Generics。

// 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;
        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;
        }
    }
}

我无法弄清楚几行,即:

Node n = new Node(t);
n.Next = head;
head = n;

对我而言,您似乎正在创建一个带有一些数据参数的Node的新实例,然后将其设置为链接列表中的下一个节点(我认为它更适合成为前一个节点),然后将该节点分配给对我来说没有意义。

我已经在调试中多次尝试了代码,但仍然无法确切地知道发生了什么。虽然有人能帮帮我吗?

3 个答案:

答案 0 :(得分:5)

它将新节点添加到列表的头部。新节点将其“下一个”指针设置为旧头,然后将新节点设置为列表的新当前头。

换句话说,如果你开始......

C -> B -> A

^ head of list

然后你结束了......

D -> C -> B -> A

^ new head of list, and D.next points to C.

答案 1 :(得分:2)

正如其他人所说,它正在向列表的前面添加一个元素。为什么?因为无论列表中有多少项,所以在列表前面添加元素需要相同的时间,因此它是O(1)(或常量)时间。

如果你要添加到列表的TAIL,你必须查看第一个项目,找到下一个项目,检查它的下一个项目,然后重复,直到你找到一个没有下一个项目的项目(即它next属性为null)。这是O(n)时间或线性,其中n是列表中的项目数。

因此,从有效的角度来看,添加到列表的头部要好得多。

答案 2 :(得分:0)

它在列表的前面中添加了一个元素。

伪码:

make new node n out of t.
n's next node is the current head.
the new head of the list is n.