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也变化(删除该节点)了,这又是怎么回事.
可能我表达的不太清楚,希望能理解我意思的高手,帮我解释解释,谢谢.
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也变化(删除该节点)了,这又是怎么回事.
可能我表达的不太清楚,希望能理解我意思的高手,帮我解释解释,谢谢.
Link current = first;
Link before = first;
对current和before操作时,为什么可以对first的链表内容进行改变?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
而在displayAll()方法中也使用个这种引用Link current = first; 然而为什么current就没有对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了。
只是让current,before指赂了first所指引的结点,并没有对first进行任何改变和修改。
只是让current,before指向了first所指引的结点,并没有对first进行任何改变和修改。
是before.setNext(current.getNext);进行操作的.
为什么current和before操作链表(如删除),first也进行相应的变化;
而displayAll()中的current没有对first起到变化.可能是我不知道如何表达,大家也没有弄懂我的问题.不好意思.希望大家帮我解释解释,谢谢.
为什么能修改节点?
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.
其中,current可以对first链点进行修改操作吗?总是想不明白,为什么可以?引用也可以修改吗?
正是为了不改变first的值,所以才用current和before两个变量来操作,先把first的值给了current和before.而first本身并没有改变,first还是一直指向第一个结点.以后在找与data相同的结点的过程中,只是改变了current和before的值,first并没有改变啊.最后,只有要删除的结点是第一个结点时,才把first修改一下,让它指向了第二个结点。
我英语更差。当你修改current时,也就是让current指向了其它结点,first还是指向第一个结点的。current和first还有before都是引用,有一点点C中的指针的意思。
当current=first后,current是黑线所示,指向了第一个结点。这时第一个结点有两处引用指向,分别是first和current.
当current=current.getNext()之后,current如红线所示。黑线做废。这时first还是指向第一个结点的。
当再执行一次current=current.getNext()之后,current如绿线所示。红线也做废。这时first还是指向第一个结点。引用你可以看成一个操作对象的遥控器,在java中一切针对对象的操作都是通过引用来实现的。引用指向的东西者是实际的对象.
牛B。难怪8月份 你的J2SE的分那么多。
如果觉得不合你的要求的话,你也可以在它的基础上自己再重写一些实现。
没有必要全都自己来写。