首先,
public Student first; 
public Student last; 
这两行代码是定义的两个对象引用,不是定义的两个对象。
在经过第一次赋值之后,你的first和last都是指向了同一个对象
所以在接下来第二轮赋值的时候,当你先修改了last指向的对象额next值,在first那里看到的也是同样的效果,因为它和last操作的都是同一个对象。如果要改,可以改成下面的样子
if (firs == null)
first = st;
else if (last == null)
{
last = st;
first.next = last;
}
else
{
first = last;
last = st;
fist.next = last;
}
不过,到最后,链表的第一个对象会丢失,如果需要的话,你自己想办法先存起来吧。

解决方案 »

  1.   

        first = st; 
    else 
        last.next = st; ——第一次赋值时,last此时为空的引用,这个操作不合时宜吧?
      

  2.   

    它后面有个last = st;所以last第一次赋值后不为空,但导致了第一次赋值后,first跟last都指向了同一个st
      

  3.   

    if (first == null) 
    first = st; 
                      else 
    last.next = st; 
    last = st; 因为else 没有{}默认只执行一句话,所以,无论是if条件满足,还是else条件满足,last = st都会执行,由于当前程序满足if条件,将st赋值给first,后又把st赋值给last,first和last指向的同一对象,地址当然是相同的
      

  4.   

    这个问题我费解的是
    Student first; Student last 是不同的两个引用对象,第一次执行tr.insert(); 的时候当if(first==null)为 true 的时候 执行 first = st;语句将st付给了 first;之后再执行 last = st 后 将st 给了 last; 
    第二次执行tr.insert(); 的时候当if(first==null)为 false 的时候 执行 last.next = st ;语句将st付给了last.next ;之后再执行 last = st 后 将st 给了 last; 
    但是我想不通的是last.next 接受完数据后 first.next 同样也接受到了数据。并且 last.next == first.next 的时候证明完全是一个地址。因为是两个不同的引用对象,在没有任何操作语句的情况下出现这种状况我很费解。!  
    楼上说是first跟last都指向了同一个st 这个我了解,但是给 last.next 赋值 为什么 first.next 会有数据这个是我要想要解决的。
      

  5.   

    first和last都是指向的同一个对象,所以first.next == last.next == st.next,都是同一个属性
    如果这个对象的next变了,那无论是在first还是last看来,它的next都已经改变了