一个关于linkList的问题,请教高手解答疑惑

yanjianbin2 2014-02-13 03:06:42
先看代码,如下:
package 数组;

public class LinkedList<T> {

private static class Node<T> {
T data;
Node<T> next;

Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
Node(T data) {
this(data, null);
}
}

private Node<T> head, tail;

public LinkedList() {
head = tail = null;
}

/**
* judge the list is empty
*/
public boolean isEmpty() {
return head == null;
}

/**
* 输出链表的所有序列的值
*/
public void traverse() {
if (isEmpty()) {
System.out.println("null");
} else {
for (Node<T> p = head; p != null; p = p.next)
System.out.println(p.data);

}
}

/**
* 插入链表的值从链表的最后一个序列开始
*/
public void addFromTail(T item) {
Node<T> newNode = new Node<T>(item);
Node<T> p = null;
if (!isEmpty()){
for ( p = head; p != null; p = p.next){
if(p.next == null){
/*这里出现了一个情况,当走完p.next = newNode的时候,p的值居然已经跟 head同步了,完全不用走 head = p这样的代码
* */
p.next = newNode;
break;
}
}
}else{
p = newNode;
head = p;
}
}


public static void main(String args[]){
LinkedList<String> test = new LinkedList<String>();
test.addFromTail("yan");
test.addFromTail("li");
test.addFromTail("yu");
test.traverse();
}
}

我的疑问在53行中说了,怎么都没弄明白,我明明没有对head进行赋值,最后的结果却是打印head的时候,可以将所有插入的值都打印出来
...全文
180 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanjianbin2 2014-02-14
  • 打赏
  • 举报
回复
已验证。song_1990的解释是合理的
乔巴大大 2014-02-14
  • 打赏
  • 举报
回复
断点调试下 可以看出 前一个的new Node<T>(item).next 都是下一个的new Node<T>(item),如果把new出来的Node对象比作一个圆圈,第一个圆圈是最大的以后每个圆圈都是画在上一个圆圈里面的嵌套关系
乔巴大大 2014-02-14
  • 打赏
  • 举报
回复
引用 3 楼 kanorl 的回复:
第一次addFromTail()走的是else
同意 if(!isEmpty())为false自然是走的else,然后就是把new Node赋给了head啊
yanjianbin2 2014-02-13
  • 打赏
  • 举报
回复
引用 1 楼 song_1990 的回复:
for ( p = head; p != null; p = p.next) 这里p=head,这是把head的对象引用赋值给p,就也就是对象head的地址值给了p,p发生改变,head值也会变了
这种解释很合理,但是验证上我暂且无法验证
kanorl 2014-02-13
  • 打赏
  • 举报
回复
第一次addFromTail()走的是else
卡卡吉利 2014-02-13
  • 打赏
  • 举报
回复
引用 1 楼 song_1990 的回复:
for ( p = head; p != null; p = p.next) 这里p=head,这是把head的对象引用赋值给p,就也就是对象head的地址值给了p,p发生改变,head值也会变了
+1
song_wl 2014-02-13
  • 打赏
  • 举报
回复
for ( p = head; p != null; p = p.next) 这里p=head,这是把head的对象引用赋值给p,就也就是对象head的地址值给了p,p发生改变,head值也会变了

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧