public class LinkList {
private Link first;
         ...其它方法省略
          //打印全部数据
public void displayAll(){
Link current = first;
while (current != null) {
System.out.print(current.getData() + " ");
current = current.getNext();
}
System.out.println();
}
        //直接用成员first打印全部数据
public void testDisplayAll(){
while(first != null){
System.out.print(first.getData()+" ");
first= first.getNext();
}
System.out.println();
}
//打印当前头指针(first)的当前值
public void firstValue(){
if(first != null){
System.out.println("first当前值:"+first.getData());
}else {
System.out.println("当前值为:NULL");
}
}
}80 20 70 30 50 这个是用//打印全部数据函数打印的displayAll()
first当前值:80
+++++++++++++++++++++++
80 20 70 30 50 这个是用//直接用成员first打印全部数据testDisplayAll()
当前值为:NULL这个结果我大概可以想明白.
可是这个方法
//删除数据
public void delete(long data){
Link current = first;
Link before = first;

while(current.getData()!=data){
if(current.getNext() == null){
return;
}
before = current;
current = current.getNext();
}
         if(current == first){
first = first.getNext();
}else{
before.setNext(current.getNext());
}
}
这里要删除节点,为什么不直接用成员first直接操作,而是用before对象修改first的链表成员,结果是好用的.
    不过我不明白,displayAll()方法里current的Data值变化,类成员first没有变化,如果是这样的话,那delete()方法里,current进行删除操作(删除该节点),为什么first也变化(删除该节点)了,这又是怎么回事.
可能我表达的不太清楚,希望能理解我意思的高手,帮我解释解释,谢谢.

解决方案 »

  1.   

    在displayAll()方法中并没有对first进行任何的修改,此方法中first只是指明了链表的起点。在testDisplayAll()方法中你用first进行遍历,对first进行了修改,结果你虽然完成了遍历但同时你也破坏了链表.最终这个链表为空。在delete()方法中,是按data关键字来删除这个节点,如果这个节点是第一个数据节点,也就是frist后一个节点,如果要删除这个节点那么first肯定要改变啊,必须让first指向第二个数据节点。当然如果不是第一个数据节点就不用修改first了。
      

  2.   

    delete方法中:
    Link current = first; 
    Link before = first; 
    对current和before操作时,为什么可以对first的链表内容进行改变?
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    而在displayAll()方法中也使用个这种引用Link current = first; 然而为什么current就没有对first进行操作呢?
    嗯,我想问的大概就是这个问题了,这是我想不懂的地方,能详细点说吗?
      

  3.   

    这里要删除节点,为什么不直接用成员first直接操作,而是用before对象修改first的链表成员,结果是好用的. 
    回答:
    这个,我不明白你要问什么。不过我不明白,displayAll()方法里current的Data值变化,类成员first没有变化。
    回答:
    first这个属性,是属于LinkList的。它代表链表的第一个元素。难道因为你打印了所有的元素,第一个元素就要变化吗?那显然是不成立的。如果是这样的话,那delete()方法里,current进行删除操作(删除该节点),为什么first也变化(删除该节点)了,这又是怎么回事. 
    回答:
    不是所有的情况下都改变first这个属性了。你要remove的元素可能正好是第一个元素,在这种情况下,整个链表的第一个元素就应该是改变前的链表的第二个元素。注意下面这个循环: while (current.getData() != data) {
    if (current.getNext() == null) {
    return;
    }
    before = current;
    current = current.getNext();
    }这个循环结束以后,current变量代表的,就是要被删除的元素。然后: if (current == first) {
    first = first.getNext();
    } else {
    before.setNext(current.getNext());
    }如果current是第一个元素,则用链表的第二个元素作为新的first元素。
    如果current不是第一个元素,则让current的前一个元素的next指向current的后一个元素。
    这样从链表中就找不到current了。
      

  4.   


    只是让current,before指赂了first所指引的结点,并没有对first进行任何改变和修改。
      

  5.   


    只是让current,before指向了first所指引的结点,并没有对first进行任何改变和修改。
      

  6.   

    一个链表,如果没和引用指向第一个个结点了,这还是链表吗?你以后还怎么访问这个链表的结点?所以链表必须维护一个引用(就是你代码中的first)来指向第一个结点。这个引用是不能轻易改变。testDisplayAll()是胡来。把指向链表第一个结点的引用指向了null.delete()方法只有在删除第一个结点时,才修改first(让它指向原来链表的第二个结点).
      

  7.   

    delete方法中不是对链表进行节点删除了吗?
    是before.setNext(current.getNext);进行操作的.
    为什么current和before操作链表(如删除),first也进行相应的变化;
    而displayAll()中的current没有对first起到变化.可能是我不知道如何表达,大家也没有弄懂我的问题.不好意思.希望大家帮我解释解释,谢谢.
      

  8.   

    那delete()方法中为什么current和before可以对first进行操作呢?
      

  9.   

    java里的引用不是用指针不一样吗?
    为什么能修改节点?
      

  10.   

    public void delete(long data){ 
       Link current = first; 
       Link before = first; 
       if(first==null){
         return ;
       }
       while(current.getData()!=data){ 
           if(current.getNext() == null){ 
                return; 
           } 
           before = current; 
           current = current.getNext(); 
       } 
       if(current == first){ 
           first = first.getNext(); 
       }else{ 
           before.setNext(current.getNext()); 

    稍改一下.加一个if判断一下first是不是null.
    我怎么觉得before引用不应该叫before, 应该叫behind.
      

  11.   

    before是我瞎起的名子,英语不是很好,呵呵.Link current = first;
    其中,current可以对first链点进行修改操作吗?总是想不明白,为什么可以?引用也可以修改吗?
      

  12.   


    正是为了不改变first的值,所以才用current和before两个变量来操作,先把first的值给了current和before.而first本身并没有改变,first还是一直指向第一个结点.以后在找与data相同的结点的过程中,只是改变了current和before的值,first并没有改变啊.最后,只有要删除的结点是第一个结点时,才把first修改一下,让它指向了第二个结点。
      

  13.   

    是不是说,Link current = first之后,current相当于first了,可以对first进行任何操作了.
      

  14.   


    我英语更差。当你修改current时,也就是让current指向了其它结点,first还是指向第一个结点的。current和first还有before都是引用,有一点点C中的指针的意思。
      

  15.   


    当current=first后,current是黑线所示,指向了第一个结点。这时第一个结点有两处引用指向,分别是first和current.
    当current=current.getNext()之后,current如红线所示。黑线做废。这时first还是指向第一个结点的。
    当再执行一次current=current.getNext()之后,current如绿线所示。红线也做废。这时first还是指向第一个结点。引用你可以看成一个操作对象的遥控器,在java中一切针对对象的操作都是通过引用来实现的。引用指向的东西者是实际的对象.
      

  16.   

    以上我问的问题,我是明白了,谢谢楼上的几位.还想问最后一个问题.在实际工作中,是用自己定义的链表或是数组,栈,队列等, 还是用JAVA类库现成的类,哪一个好?哪一个用的多?
      

  17.   

    当然用java现成的。一般情况没有必要自己写。
      

  18.   


    牛B。难怪8月份 你的J2SE的分那么多。
      

  19.   

    java的元素容器超好用的,像LinkedList、ArrayList这些都可以当数组,栈,队列来用的
      

  20.   

    java中已经有很多现成的了。在java.util包中。
    如果觉得不合你的要求的话,你也可以在它的基础上自己再重写一些实现。
    没有必要全都自己来写。