我有一个简单的Java问题。如下面的代码所示:
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode start = new ListNode(0);
ListNode slow = start, fast = start;
slow.next = head;
//Move fast in front so that the gap between slow and fast becomes n
for(int i=1; i<=n+1; i++) {
fast = fast.next;
}
//Move fast to the end, maintaining the gap
while(fast != null) {
slow = slow.next;
fast = fast.next;
}
//Skip the desired node
slow.next = slow.next.next;
return start.next;
}
开始,快速和慢速寻址同一个对象。我不明白为什么“slow = slow.next;”不会改变起始对象,但是“slow.next = slow.next.next;”将改变起始对象。
答案 0 :(得分:2)
slow
是一个局部变量,因此更改其值以引用ListNode
的新实例并不会影响原始列表。
但是,如果slow
引用属于您列表的ListNode
,则更改slow.next
以引用新实例会更改列表的状态。
如果使用setter修改下一个节点,可能会更清楚:
slow.next = slow.next.next;
相当于:
slow.setNext(slow.next.next);
因此,如果slow
引用属于您的列表的ListNode
,则更改其状态会改变列表的状态。