CCI书中的代码:
public class ListNode {
int val;
ListNode next = null;
ListNode(int x) {
this.val = x;
}
而且:
public void appendToTail(int d) {
ListNode end = new ListNode(d);
ListNode n = this;
while (n.next != null) {
n = n.next;
}
n.next = end;
}
原文:5 - > 10 - > 15
据我所知,在这种情况下,“n”和“this”在调试和单步执行后引用相同的对象:
“n”变为15 - > 20
“this”变为5 - > 10 - > 15 - > 20
这怎么可能?当我改变“n”时,“this”也会改变吗?
所以我在“n”上做的一切,BESIDES追加20,并没有反映出“这个”。
更新:
任何有同样问题的人都应该阅读this。
答案 0 :(得分:1)
在你的while循环中你说:
n = n.next
当执行该行代码时,将n的值从“this”更改为n.next。这指向列表中的当前链接对象,然后指向完全不同的对象。当您浏览链表时,当您通过链表中的每个链接时,n的值会不断更新。
当你到达链表的末尾时没有下一个,即n的值为null。因此,您退出while循环并添加一个新链接到链接列表的末尾。
答案 1 :(得分:0)
来自Java Language Specification:
[...]关键字
this
表示一个值,该值是对为其调用实例方法或默认方法的对象的引用[...]
您只在列表的一个特定节点上调用appendToTail(int)
,因此this
始终引用同一个对象。如果要在调试期间“进入”每个节点,可以按如下方式更改实现:
public void appendToTail(int d) {
if (next != null) {
next.appendToTail(d);
} else {
next = new ListNode(d);
}
}