一个链表的节点类
class ListNode<T>
    {
        private T data;        public T Data
        {
            get { return data; }
            set { data = value; }
        }
        private ListNode<T> next;        internal ListNode<T> Next
        {
            get { return next; }
            set { next = value; }
        }        public ListNode(T val)
        {
            data = val;
            next = null;
        }
        public ListNode(ListNode<T> p)
        {
            next = p;
        }
        public ListNode()
        {
            data = default(T);
            next = null;
        }
    }
在链表中有一个头结点引用这个是这个节点的一个实例代表链表的开头。但是我们在遍历链表的时候通常会这么做
public void Append(T data)
        {
            
            ListNode<T> newNode = new ListNode<T>(data);
            ListNode<T> currNode = null;
            if (head == null)
            {
                head = newNode;
                return;
            }
            //?currNode保存的到底是head的引用还是一个新的节点
            currNode = head;
            while (currNode.Next != null)
            {
                currNode = currNode.Next;
            }
            currNode.Next = newNode;
            length++;
        }
通过next属性来遍历整个链表,如上述代码一样。
One question:
  类是引用类型,当把head的节点赋值给currNode时应该是把引用复制给currNode,更改currNode的值也就是更改head的值,但是在上诉代码中没有这个结果,当遍历完链表后head还是保存的头结点的引用。
  但是如果这样:ListNode<int> a = new ListNode<int>(12);
            ListNode<int> b = a;
            b.Data = 4;那么当b节点的data属性改变时a节点的也改变了,这样才是符合引用类型的特征的。谁告诉我上面那个怎么回事,求大神。如果我问题说的不够详细的话请指出来我来补充

解决方案 »

  1.   

    在C#中,只要是class,肯定是引用。
      

  2.   

    但是引用的话为什么head的值没有改变
      

  3.   

    说胆你还是没能正确理解引用类型。假如有一个类Person, 其有一个属性string Name{get;set:}Person A = new Person(); A.Name = "Amy";
    Person B;
    Person C = new Person();这时候,我们设置B=A;
    这时候A,B指向的是同一个堆中的内存块,但A,B是存储在栈中的不同的内存块(内容为4字节的内存地址),无论是通过A还是B去修改Name属性,都是修改的同一个实例。但假如你设置B=new Person();或B = C;
    那只是把B的内容变了一下,指向了堆中另一块内存。B之前所指向的实例并不受影响。